我正在编写用于测试单元测试值的扩展方法.一个天真的例子是:
public static void ShouldBeTrue(this bool value)
{
if(!value)
{
throw new AssertFailedException("Expected true");
}
}
Run Code Online (Sandbox Code Playgroud)
并在测试中使用它:
someBool.ShouldBeTrue();
Run Code Online (Sandbox Code Playgroud)
一切正常,除了抛出异常的行将是我在"测试结果"窗口中双击失败的测试时最终结束的行,并且在"测试结果详细信息"中,抛出行显示在错误堆栈跟踪中.
有没有办法围绕这个,所以"someBool.ShouldBeTrue();":
如何使用FakeItEasy创建假冒,允许在连续调用时使用不同的返回值.这是我希望能够做到的一个例子:
var enumerator = A.Fake<IDictionaryEnumerator>();
A.CallTo(() => enumerator.MoveNext()).Returns(true); //Expected value for first call
A.CallTo(() => enumerator.Key).Returns("key1");
A.CallTo(() => enumerator.Value).Returns("value1");
A.CallTo(() => enumerator.MoveNext()).Returns(false); //Expected value for second call
Assert.IsTrue(enumerator.MoveNext()); //Fails
Assert.IsFalse(enumerator.MoveNext());
Run Code Online (Sandbox Code Playgroud)
断言将失败,因为它最后一次设置的MoveNext将覆盖第一个.
可以在FakeItEasy中做我想做的事吗?
.
[编辑]
澄清原始问题的例子并在下面提供了一个工作示例.
根据Patrik的答案,此代码显示了如何设置假货.诀窍是反转所有设置和使用Once().
var enumerator = A.Fake<IDictionaryEnumerator>();
A.CallTo(() => enumerator.MoveNext()).Returns(false).Once();
A.CallTo(() => enumerator.MoveNext()).Returns(true).NumberOfTimes(2);
A.CallTo(() => enumerator.Key).Returns("key2").Once();
A.CallTo(() => enumerator.Value).Returns("value2").Once();
A.CallTo(() => enumerator.Key).Returns("key1").Once();
A.CallTo(() => enumerator.Value).Returns("value1").Once();
while(enumerator.MoveNext())
{
Debug.WriteLine(enumerator.Key + ": "+ enumerator.Value);
}
Run Code Online (Sandbox Code Playgroud)
这将打印:
key1: value1
key2: value2
Run Code Online (Sandbox Code Playgroud)