我有一个测试,其中 NSubstitute 检查假类中的错误调用。当我像下面的代码一样进行测试时,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
)期间回调替代品是很有用的。
关于c# - Nsubstitute:收到检查错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38520147/