[英]Assert that “nothing happened” when writing unit test
在編寫單元測試時,是否有一種簡單的方法來確保沒有意外發生?
由於可能產生的副作用是無限的,因此添加大量的Assert來確保在每個步驟中沒有發現任何改變都是徒勞的,並且混淆了測試的目的。
我可能錯過了一些框架功能或良好實踐。
我正在使用C#7,.net 4.6,MSTest V1。
編輯:最簡單的示例是測試視圖模型的設置器,應該發生兩件事:應更改值,並應引發PropertyChanged事件。 這2件事很容易檢查,但是現在我需要確保其他屬性值沒有更改,沒有引發其他事件,沒有碰到系統剪貼板...
您錯過了單元測試的重點。 它們是“證明”。 您不能在邏輯上證明否定性斷言,因此即使嘗試也沒有任何意義。
每個單元測試中的斷言都應證明已完成所需的行為。 就這樣。
如果我們將問題簡化為荒謬的話,那么每個單元測試都將要求我們斷言所測試的功能並未引發熱核戰爭。
單元測試不是您需要執行的唯一測試。 有功能測試,集成測試,可用性測試等。每個測試都有其自己的重點。 對於單元測試,重點是證明單個功能的預期行為。 因此,如果該功能應該完成2件事,則只需斷言這2件事中的每件事都發生,然后繼續。
確保不發生任何“不良”或意外事件的選項之一是確保使用依賴項注入和模擬的良好做法:
[Test]
public void TestSomething()
{
// Arrange
var barMock = RhinoMocks.MockRepository.GenerateStrictMock<IBar>();
var foo = new Foo(barMock);
// Act
foo.DoSomething();
// Assert
...
}
在上面的示例中,如果Foo
意外觸摸Bar
,則將導致異常(嚴格的模擬),並且測試將失敗。 這種方法可能不適用於所有測試用例,但可以作為其他潛在實踐的很好的補充。
如果“檢查是否有其他事情發生”的范圍是確保模型的狀態不變,那么問題出在這種情況。
編寫一個輔助函數,將事件之前的模型與事件之后的模型進行比較。 讓它返回已更改的屬性,然后可以斷言返回列表中只有要更新的屬性。 這種幫助程序是便攜式,可維護和可重用的
檢查模型狀態是單元測試的有效應用。
僅在引用透明的語言(例如Safe Haskell)中才有可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.