繁体   English   中英

NSubstitute:Mock方法未返回预期结果

[英]NSubstitute: Mock method is not returning expected result

我是NSubstitute,模拟和单元测试的新手。

我正在尝试使用NSubstitute删除我在测试中的类中具有的某些依赖关系,但是基于我对它们的配置方式,模拟对象中的方法表现NSubstitute 这是我在Visual Studio中创建的示例:

  1. 接口和具体类被替换。 注意, MyConcreteClass.MyMethod()返回false

     public interface IMyInterface { bool MyMethod(string arg); } public class MyConcreteClass : IMyInterface { public bool MyMethod(string arg) { return false; } } 
  2. 我的课程正在测试:

     public class MyTestedClass { private IMyInterface _concrete; public MyTestedClass() { _concrete = new MyConcreteClass(); } public MyTestedClass(IMyInterface mock) { _concrete = mock; } public bool MyConcreteMethod(string arg) { return _concrete.MyMethod(arg); } } 
  3. 我的MyTestedClass单元测试类:

     [TestClass] public class UnitTest1 { [TestMethod] public void Given_MyMethodIsUsingAMock_ShouldReturnTrue() { // Arrange var myMock = Substitute.For<IMyInterface>(); myMock.MyMethod("blah").Returns(true); var myTestedObject = new MyTestedClass(myMock); // Act var result = myTestedObject.MyConcreteMethod("blah blah"); // Assert Assert.AreEqual(result, true); // This assertion fails! } [TestMethod] public void Given_MyMethodIsNotMock_ShouldReturnFalse() { // Arrange var myTestedObject = new MyTestedClass(); // Act var result = myTestedObject.MyConcreteMethod("blah blah"); // Assert Assert.AreEqual(result, false); // This assertion passes. } } 
  4. 测试结果表明, Given_MyMethodIsUsingAMock_ShouldReturnTrue()失败:

     MyUnitTests (2 tests) [0:00.190] Failed: 1 test failed MyUnitTests (2 tests) [0:00.190] Failed: 1 test failed UnitTest1 (2 tests) [0:00.190] Failed: 1 test failed Given_MyMethodIsNotMock_ShouldReturnFalse [0:00.000] Success Given_MyMethodIsUsingAMock_ShouldReturnTrue [0:00.189] Failed Assert.AreEqual failed. Expected:<False>. Actual:<True>. at MyUnitTests.UnitTest1.Given_MyMethodIsUsingAMock_ShouldReturnTrue() in "c:\\MyWorkspace\\projects\\NSubstituteMocking\\MyUnitTests\\UnitTest1.cs":line 23 

看起来我缺少一个琐碎的配置,但它使我难以理解。

当给定"blah"时, MyMethod安排返回true

myMock.MyMethod("blah").Returns(true);

但是在采取行动时会为其提供"blah blah"

var result = myTestedObject.MyConcreteMethod("blah blah");

由于预期的/已安排的参数不匹配,因此该模拟的行为与配置的不同。

向模拟提供预期的内容,以使其表现出预期的效果。

[TestMethod]
public void Given_Blah_MyConcreteMethod_ShouldReturnTrue() {
    // Arrange
    var myMock = Substitute.For<IMyInterface>();
    var arg = "blah";
    var expected = true;
    myMock.MyMethod(arg).Returns(expected);
    var myTestedObject = new MyTestedClass(myMock);

    // Act
    var actual = myTestedObject.MyConcreteMethod(arg);

    // Assert
    Assert.AreEqual(expected, actual); // This should pass
}

注意使用变量存储提供的和期望的值,以便在进行测试时可以减少错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM