单元测试应该设计成:
他们建立了一些状态
它们运行在测试
方法他们断言,有一件事是正确的测试方法完成
(参考后:单元测试的艺术由罗伊奥谢罗夫)
为什么测试旨在失败的坏事?他们可能以意想不到的方式失败,并且仍然因为失败而被标记为合格。在你的例子中,假设Should()
是被测试的方法(虽然这一点仍然存在,即使它不是),你在上面编写测试并将其标记为'预计失败'。它失败。一切安好。在几个月内,你会回到Should()
并意识到它需要一些重构,所以你改变它的实现。
现在,在您的示例中,Should()
会引发异常,因为您意外引入了一个错误。但是你的测试(因为现在的例外而不是逻辑失败)被标记为应该失败,并且确实如此,所以尽管发生了重大变化,但它仍被标记为通过。
测试的目的应该是通过而不是失败,如果它以另一种意想不到的方式失败,你会得到通知。所以,在你的榜样,你应该写有相反的逻辑测试:
[Test]
public void TypeOf_ShouldBeString() {
string str = "abc";
str.Should().Be.TypeOf<string>();
}
或:
[Test]
public void TypeOf_ShouldNotBeInt() {
string str = "abc";
str.Should().Not.Be.TypeOf<int>();
}
(不知道你正在使用的语法,所以。不是可能需要用正确的语法替换,但情绪持续)。编辑2:如果你想要做的是确保你的Should()方法失败(通过失败一个Assert。方法),那么你想要做的就是捕获Assert的NUnit AssertionException。静态方法抛出。试试这个:
[Test]
[ExpectedException(typeof(AssertionException))]
public void ShouldBeTypeOf_WithInt_Fails() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
我从来没有看过它,但核心NUnit代码如何测试它的自我以证明测试可能失败? – 2010-12-21 23:42:14