2010-12-21 160 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)); 
} 

這種方式讓我有相同的測試,有兩個預期,一個成功的,和一個失敗。

相關問題