你如何指定NUnit测试失败?

时间:2010-12-21 20:22:29

标签: nunit

是否有办法指定您希望NUnit测试失败,这意味着应将失败报告为通过,并且应将通知报告为失败?这在测试您自己的NUnit扩展时很有用。以下是我希望能够做的事情的一个例子:

[Test]
[ExpectFail]
public void TypeOf_fail() {
    string str = "abc";
    str.Should().Be.TypeOf<int>();
}

这不能编译因为[ExpectFail]是一个虚构的属性来说明我想要做的事情,但方法中的代码工作正常。此问题特定于测试NUnit扩展,因为您通常可以轻松编写测试以通过,而不是失败。在这种情况下,您需要证明可以使用您正在测试的NUnit扩展编写失败的测试。

4 个答案:

答案 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替换为可能的最具体的异常。