c# - Nsubstitute:收到检查错误的方法

标签 c# testing nunit nsubstitute

我有一个测试,其中 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/

相关文章:

c# - 在 EF 中保存对象时,不会在数据库中建立新的多对多连接

c# - 如何将 List<T> 转换为 BsonArray 以保存 MongoDB 文档

c# - 使用带有 SSH.NET 的 C# 通过 SSH 流式传输/拖尾数据会泄漏内存

python - 要么/要么断言单元测试

perl - 文件更改时如何自动运行 Perl 测试套件?

c# - 如何实现 BoolToVisibilityConverter

angular - 如何为 Angular 中的输入变化编写测试用例

c# - 如何从 TestContext 获取当前参数值?

nunit - "Inverted"NUnit 测试中的超时功能

c# - 使 NUnit 在无效测试参数上失败