gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:52:25 24 4
gpt4 key购买 nike

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

在这个人为的示例中,我将使用 IDictionary<string, string> 的 NSubstitute 模拟.

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;线路为string value = null; ,断言在所有迭代中都通过。

是什么导致了这种异常?这是由于我缺少 C# for 循环的某些语义,还是 NSubstitute 库的问题?

最佳答案

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

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

关于c# - NSubstitute 在循环中多次调用时返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11661242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com