單元測試應該設計成:
他們建立了一些狀態
它們運行在測試
方法他們斷言,有一件事是正確的測試方法完成
(參考後:單元測試的藝術由羅伊奧謝羅夫)
爲什麼測試旨在失敗的壞事?他們可能以意想不到的方式失敗,並且仍然因爲失敗而被標記爲合格。在你的例子中,假設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>();
}
我從來沒有看過它,但核心NUnit代碼如何測試它的自我以證明測試可能失敗? – 2010-12-21 23:42:14