NSubstitute没有响应Received()断言

时间:2018-06-25 10:30:29

标签: c# nsubstitute

我有一个测试,该测试使用带有参数的构造函数模拟非接口对象:

    [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();
    }

测试仍然通过...

这是嘲笑类而不是接口的副作用吗?

1 个答案:

答案 0 :(得分:1)

您只能模拟虚拟成员。模拟框架只是为您覆盖了虚拟成员,类似于:

class MyMock : MyObject
{
    override void SomeMethodWhichIsCalled()
    {
        throw new Exception("Method was called");
    }
}

由于您的方法不是virtual,因此框架无法覆盖它,因此调用了SomeMethodWhichIsCalled的实际方法MyObject,因此永远不会引发异常。

除非可以使用方法virtual,否则您无能为力。您可以尝试通过反射访问某些内部状态,但这在很大程度上取决于SomeMethodWhichIsCalled的工作。特别是,这只是一个肮脏的hack。