有没有办法指定您希望 NUnit 测试失败,这意味着失败应报告为通过,而通过应报告为失败?这在测试您自己的 NUnit 扩展时非常有用。这是我希望能够做的事情的一个例子:
[Test]
[ExpectFail]
public void TypeOf_fail() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
这无法编译,因为 [ExpectFail] 是一个虚构的属性,用于说明我想要做什么,但方法内的代码工作正常。此问题特定于测试 NUnit 扩展,因为您通常可以轻松编写测试以通过,而不是失败。在这种情况下,您需要证明可以使用您正在测试的 NUnit 扩展编写失败的测试。
我知道这是一篇旧文章,但以下是使用 NUnit 对我有帮助的内容:
[TestCase("SomeValidValue")]
[TestCase("{3X5XFX9X-7XCX-4XCX-8X3X-3XAXEX9X0XBX}", ExpectedException = typeof(AssertionException))]
public void GetSpecificConfiguration(string key)
{
Assert.IsNotNull(Config.Instance.GetRecord(key));
}
这种方法让我可以进行相同的测试,有两种期望,一种成功,一种失败。
单元测试的设计应使得:
他们建立了一些国家
他们运行测试中的方法
他们断言,在被测方法完成后,有一件事是正确的
(参考: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>();
}
那
Assert.Throws<XXXException>(x.DoSomething());
这里的好处是,如果测试通过(即抛出异常),返回值是实际的异常本身,然后您可以询问它并基于此进一步断言..
鉴于在这种情况下您想要测试 NUnit 扩展,我假设它通过进行 Assert 调用来运行,您可以
Assert.Throws<AssertionException>(...),
然后执行上述操作。
我正在考虑编写一些类似的测试管道代码,我可能需要对其进行测试,所以如果我在该领域发现任何其他内容,我会告诉你。
如果您的意思是代码块预计会抛出异常以使测试通过,则代码如下:
[Test]
[ExpectedException(typeof(Exception))]
public void TypeOf_fail() {
string str = "abc";
str.Should().Be.TypeOf<int>();
}
当然,请将 Exception 替换为可能的最具体的异常。