Nsubstitute:收到检查错误的方法

Nsubstitute: Received checks wrong method

我有一个测试,其中 NSubstitute 会检查假冒的错误调用 class。当我像下面的代码一样进行测试时,Received(...) 方法检查值 factory.featureClassName 是否返回一次。

[Test]
public void CreateDataController_WhenCalled_CreatesServiceSettings()
{
    var factory = Substitute.ForPartsOf<AbstractDataServiceFactoryFake>("fileName");

    factory.CreateDataController();

    factory.Received(1).CreateServiceSettings("fileName", factory.FeatureClassName);
}

为了测试(如预期的那样)方法 CreateServiceSettings(...) 被调用一次,我必须使用以下代码:

[Test]
public void CreateDataController_WhenCalled_CreatesServiceSettings()
{
    var factory = Substitute.ForPartsOf<AbstractDataServiceFactoryFake>("fileName");
    var featureClassName = factory.FeatureClassName;

    factory.CreateDataController();

    factory.Received(1).CreateServiceSettings("fileName", featureClassName);
}

看来,Recieved()方法并没有直接连接到调用后给定的方法。谁能解释一下,为什么会这样?

这是 NSubstitute 语法的限制。

让我们分析一下第二个代码示例发生了什么:

factory
    .Received(1)    // ... check the next call has previously been received
    .CreateServiceSettings("fileName", className) 
                    // call is made to CreateServiceSettings, NSub checks
                    // it was received.

在第一个代码示例中,我们改为:

factory
    .Received(1)    // ... check the next call has previously been received
    .CreateServiceSettings("fileName", factory.FeatureClassName) 
                    // before CreateServiceSettings is invoked, its arguments
                    // must be evaluated. So factory.FeatureClassName
                    // is called next and NSubstitute checks that.

换句话说,NSubstitute 看到第二个代码示例是这样的:

var _ = factory.Received(1).FeatureClassName;
factory.CreateServiceSettings("fileName", _);

为避免这种情况,避免在断言(如 Received)或配置(如 Returns)期间调用替代项很有用。