繁体   English   中英

NSubstitute在循环中多次调用时返回意外值

[英]NSubstitute returning unexpected values when called multiple times in a loop

我遇到过使用NSubstitute模拟带输出参数的方法的情况。 我不确定如何最好地在文本中解释它,所以我将使用一些人为的例子和测试用例......

在这个人为的例子中,我将使用一个IDictionary<string, string>的NSubstitute mock。

private static IDictionary<string, string> GetSubstituteDictionary()
{
    IDictionary<string, string> dict = Substitute.For<IDictionary<string, string>>();

    string s;
    dict.TryGetValue("key", out s).Returns(ci => { ci[1] = "value"; return true; });

    return dict;
}

现在,当我以简单的方式使用这个模拟对象时,它会按预期返回:

[Test]
public void ExampleOne()
{
    var dict = GetSubstituteDictionary();

    string value;
    bool result = dict.TryGetValue("key", out value);

    Assert.That(result, Is.True); // this assert passes.
    Assert.That(value, Is.EqualTo("value")); // this assert passes.
}

但是,当我在for循环中调用相同的代码时,我会遇到一些意外的行为:

[Test]
public void ExampleTwo()
{
    var dict = GetSubstituteDictionary();

    for (int i = 0; i < 2; i++)
    {
        string value;
        bool result = dict.TryGetValue("key", out value);

        Assert.That(result, Is.True); // this assert FAILS - unexpected!
        Assert.That(value, Is.EqualTo("value")); // this assert still passes.
    }
}

特别是, Assert.That(result, Is.True); 断言在循环的第一次迭代中传递,但在第二次(以及任何后续)迭代时失败。

但是,如果我修改string value; line to be string value = null; ,断言遍历所有迭代。

造成这种异常的原因是什么? 这是由于我缺少的C#for循环的一些语义,还是NSubstitute库的问题?

原因是value变量在循环中更改(通过输出参数设置),因此它不再与您删除的调用匹配。

您可以尝试使用.ReturnsForAnyArgs() ,尽管您需要检查存根中的键,而不是通过参数匹配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM