我有一个测试,该测试使用带有参数的构造函数模拟非接口对象:
[Test]
public void Test()
{
var myObject = Substitute.For<MyObject>("param1", "param2");
_sut.DoSomething(myObject);
myObject.Received().SomeMethodWhichIsCalled();
}
这通过了,当我调试测试时,我可以看到SomeMethodWhichIsCalled()
上的MyObject
已正确执行。
但是我现在意识到这个断言什么也没有做,因为我可以在下面添加以下内容:
[Test]
public void Test()
{
var myObject = Substitute.For<MyObject>("param1", "param2");
_sut.DoSomething(myObject);
myObject.DidNotReceive().SomeMethodWhichIsCalled();
myObject.Received().SomeMethodWhichIsCalled();
}
测试仍然通过...
这是嘲笑类而不是接口的副作用吗?
答案 0 :(得分:1)
您只能模拟虚拟成员。模拟框架只是为您覆盖了虚拟成员,类似于:
class MyMock : MyObject
{
override void SomeMethodWhichIsCalled()
{
throw new Exception("Method was called");
}
}
由于您的方法不是virtual
,因此框架无法覆盖它,因此调用了SomeMethodWhichIsCalled
的实际方法MyObject
,因此永远不会引发异常。
除非可以使用方法virtual
,否则您无能为力。您可以尝试通过反射访问某些内部状态,但这在很大程度上取决于SomeMethodWhichIsCalled
的工作。特别是,这只是一个肮脏的hack。