2010-12-21 108 views
2

有没有办法指定你想要一个NUnit测试失败,这意味着失败应该被报告为传球并且传球应该被报告为失败?这在测试自己的NUnit扩展时会很有用。这是我想能够做的事情的例子:如何指定NUnit测试失败?

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

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

+1

我从来没有看过它,但核心NUnit代码如何测试它的自我以证明测试可能失败? – 2010-12-21 23:42:14

回答

1

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

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

鉴于在这种情况下,你想测试NUnit扩展,我假设,通过使Assert调用函数,你可以Assert.Throws <AssertionException>(...),然后执行上述操作。

我想写一些类似的测试管道代码,我可能反过来需要测试,所以我会让你知道,如果我发现这方面的其他任何东西。

2

单元测试应该设计成:
他们建立了一些状态
它们运行在测试
方法他们断言,有一件事是正确的测试方法完成

(参考后:单元测试的艺术由罗伊奥谢罗夫)

为什么测试旨在失败的坏事?他们可能以意想不到的方式失败,并且仍然因为失败而被标记为合格。在你的例子中,假设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>(); 
}  
+0

我不喜欢这种解决方案,因为您发布的这些测试都没有证明可以使用扩展来产生失败的测试。 – 2010-12-21 23:24:31

0

如果你的意思是代码块预期抛出一个异常,测试通过,下面的代码:

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

当然,最具体的异常可能替代例外。

0

我知道这是旧的文章,但这里是帮助我,使用NUnit:

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

这种方式让我有相同的测试,有两个预期,一个成功的,和一个失败。

相关问题