Mat*_*ing 2 c# loops nsubstitute
我遇到的是使用NSubstitute模拟具有输出参数的方法时的情况。我不确定如何最好地用文本来解释它,因此我将使用一些人为的示例和测试用例...
在这个人为的示例中,我将使用NSubstitute模拟的IDictionary<string, string>。
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;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我以简单的方式使用此模拟对象时,它会按预期返回:
[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.
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在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.
}
}
Run Code Online (Sandbox Code Playgroud)
特别是,Assert.That(result, Is.True);断言在循环的第一次迭代中通过,但在第二次(以及任何后续)迭代中失败。
但是,如果我将string value;行修改为string value = null;,则所有迭代都会通过断言。
是什么导致此异常?这是由于我缺少的C#for循环的某些语义还是NSubstitute库的问题?
原因是该value变量在循环中更改(通过输出参数设置),因此它不再与您存根的调用匹配。
您可以尝试使用.ReturnsForAnyArgs(),尽管您需要先检查存根中的键,而不要通过参数匹配器。
| 归档时间: |
|
| 查看次数: |
1551 次 |
| 最近记录: |