如何指定 NUnit 测试应该失败?

问题描述 投票:0回答:4

有没有办法指定您希望 NUnit 测试失败,这意味着失败应报告为通过,而通过应报告为失败?这在测试您自己的 NUnit 扩展时非常有用。这是我希望能够做的事情的一个例子:

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

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

nunit
4个回答
4
投票

我知道这是一篇旧文章,但以下是使用 NUnit 对我有帮助的内容:

[TestCase("SomeValidValue")]
[TestCase("{3X5XFX9X-7XCX-4XCX-8X3X-3XAXEX9X0XBX}", ExpectedException = typeof(AssertionException))]
public void GetSpecificConfiguration(string key)
{
    Assert.IsNotNull(Config.Instance.GetRecord(key));
}

这种方法让我可以进行相同的测试,有两种期望,一种成功,一种失败。


3
投票

单元测试的设计应使得:
他们建立了一些国家
他们运行测试中的方法
他们断言,在被测方法完成后,有一件事是正确的

(参考: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>();
}    

2
投票

Assert.Throws<XXXException>(x.DoSomething());

这里的好处是,如果测试通过(即抛出异常),返回值是实际的异常本身,然后您可以询问它并基于此进一步断言..

鉴于在这种情况下您想要测试 NUnit 扩展,我假设它通过进行 Assert 调用来运行,您可以

Assert.Throws<AssertionException>(...),
然后执行上述操作。

我正在考虑编写一些类似的测试管道代码,我可能需要对其进行测试,所以如果我在该领域发现任何其他内容,我会告诉你。


0
投票

如果您的意思是代码块预计会抛出异常以使测试通过,则代码如下:

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

当然,请将 Exception 替换为可能的最具体的异常。

© www.soinside.com 2019 - 2024. All rights reserved.