是否有办法指定您希望NUnit测试失败,这意味着应将失败报告为通过,并且应将通知报告为失败?这在测试您自己的NUnit扩展时很有用。以下是我希望能够做的事情的一个例子:
[Test]
[ExpectFail]
public void TypeOf_fail() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
这不能编译因为[ExpectFail]是一个虚构的属性来说明我想要做的事情,但方法中的代码工作正常。此问题特定于测试NUnit扩展,因为您通常可以轻松编写测试以通过,而不是失败。在这种情况下,您需要证明可以使用您正在测试的NUnit扩展编写失败的测试。
答案 0 :(得分:2)
单元测试应设计为:
他们建立了一些州
他们运行测试方法
他们声称在测试方法完成后有一件事是正确的
(参考:Roy Osherove的单元测试艺术)
为什么设计的测试会导致错误?他们可能以意想不到的方式失败,并且仍然被标记为通行证,因为他们失败了。在您的示例中,假设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>();
}
(不确定你正在使用的语法,所以。可能不需要用正确的语法替换,但情绪仍然存在)。
Edit2:如果您要做的是确保您的Should()方法失败(通过失败Assert。方法),那么您要做的是捕获Assert的NUnit AssertionException。静态方法抛出。试试这个:
[Test]
[ExpectedException(typeof(AssertionException))]
public void ShouldBeTypeOf_WithInt_Fails() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
答案 1 :(得分:2)
Assert.Throws&lt; XXXException&gt;(x.DoSomething());
这里的好处是,如果测试通过(即抛出异常),返回值本身就是实际异常,然后你可以根据它进一步询问它和Assert ..
鉴于在这种情况下你想要测试NUnit扩展,我假设它通过进行Assert调用来起作用,你可以Assert.Throws&lt; AssertionException&gt;(...),然后执行上述操作。
我正在考虑编写一些类似的测试管道代码,我可能反过来需要测试,所以如果我在这个领域发现任何其他内容,我会告诉你。
答案 2 :(得分:2)
我知道这是一篇很老的帖子,但是这里有帮助我,使用NUnit:
[TestCase("SomeValidValue")]
[TestCase("{3X5XFX9X-7XCX-4XCX-8X3X-3XAXEX9X0XBX}", ExpectedException = typeof(AssertionException))]
public void GetSpecificConfiguration(string key)
{
Assert.IsNotNull(Config.Instance.GetRecord(key));
}
这种方法允许我进行相同的测试,有两个期望,一个成功,一个失败。
答案 3 :(得分:0)
如果你的意思是代码块预计会抛出一个异常让test传递,那么这就是代码:
[Test]
[ExpectedException(typeOf(Exception))]
public void TypeOf_fail() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
当然,将Exception替换为可能的最具体的异常。