我有一个非常基本的单元测试。由于某些原因,测试只通过了第一次,但随后的所有调用都失败了。下面是测试代码:
private Mock<IMyInterface> _mockObject;
public Test() {
_mockObject = new Mock<IMyInterface>();
}
[Fact]
public void ItReturnsTheRightThing() {
_mockObject.SetUp(o => o.FunctionIWantToMock()).Returns(new SpecialObject(true));
var classIWantToTest = new ClassIWantToTest(_mockObject.Object);
classIWantToTest.RunCode();
...
}接口:
internal interface IMyInterface {
SpecialObject FunctionIWantToMock();
}生产代码:
public class ClassIWantToTest {
IMyInterface _client;
internal ClassIWantToTest(IMyInterface client) {
_client = client;
}
public bool RunCode() {
SpecialObject so = _client.FunctionIWantToMock();
return so.Value; // This line is the problem
...
}
}问题是,当我运行测试时,我的模拟函数不会返回我在setup函数中设置的内容,它不会返回SpecialObject(true),而是null。然后我得到一个空引用异常。当我调试测试时,我不能单步执行_client.FunctionIWantToMock调用,它只是立即单步执行下一行并用null填充so。
发布于 2020-01-31 15:14:26
由于这并不是很有意义,所以我会尝试这样做:
[Fact]
public void ItReturnsTheRightThing() {
_mockObject = new Mock<IMyInterface>();
_mockObject.SetUp(o => o.FunctionIWantToMock()).Returns(new SpecialObject(true));
var classIWantToTest = new ClassIWantToTest(_mockObject.Object);
classIWantToTest.RunCode();
...
}试一试,如果它有效,那么中间的mock对象会受到一些干扰。
发布于 2020-02-01 04:45:07
一位同事帮我解决了这个问题。在写这个问题时,我混淆了太多的原始代码,这也是我的错。
问题是我在设置过程中向o.FunctionIWantToMock()方法传递的显式参数与在业务逻辑中传递给函数的显式参数不匹配。所以实际的测试代码是o.FunctionIWantToMock("foo", "bar")。在我的业务逻辑中,实际的函数是用_client.FunctionIWantToMock("Foo", "Bar")调用的。因此,由于参数不匹配("Foo“vs "foo","Bar”vs "bar"),SetUp实际上并没有设置我的实际代码。我将setUp函数更改为
o.FunctionIWantToMock(It.IsAny<string>(), It.IsAny<string>())
https://stackoverflow.com/questions/59998651
复制相似问题