小编hca*_*ber的帖子

如何使用"正确"的callstack创建自定义MSTest Assert方法

我正在编写用于测试单元测试值的扩展方法.一个天真的例子是:

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();":

  1. 双击"测试结果"窗口中的失败测试的行是打开的吗?
  2. 堆栈跟踪中唯一的一行?

.net unit-testing assert mstest

8
推荐指数
1
解决办法
2467
查看次数

在FakeItEasy伪造一名调查员

如何使用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)

tdd unit-testing mocking fakeiteasy

3
推荐指数
1
解决办法
1160
查看次数

标签 统计

unit-testing ×2

.net ×1

assert ×1

fakeiteasy ×1

mocking ×1

mstest ×1

tdd ×1