簡體   English   中英

在編寫單元測試時斷言“什么都沒發生”

[英]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 ,則將導致異常(嚴格的模擬),並且測試將失敗。 這種方法可能不適用於所有測試用例,但可以作為其他潛在實踐的很好的補充。

修改內容:

在“ 測試驅動開發”中,您僅編寫代碼,這些代碼將通過測試,僅此而已。 此外,您想選擇最簡單的溶劑來完成此目標。

也就是說,您最有可能從失敗的單元測試開始。 在您的情況下,一開始您不會獲得失敗的單元測試。

如果將其推到極限,則要檢查每個結果時,必須檢查應用程序中未調用format C:\\ 您可能想看看諸如KISS -principle之類的設計原則(保持簡單,愚蠢)。

如果“檢查是否有其他事情發生”的范圍是確保模型的狀態不變,那么問題出在這種情況。

編寫一個輔助函數,將事件之前的模型與事件之后的模型進行比較。 讓它返回已更改的屬性,然后可以斷言返回列表中只有要更新的屬性。 這種幫助程序是便攜式,可維護和可重用的

檢查模型狀態是單元測試的有效應用。

僅在引用透明的語言(例如Safe Haskell)中才有可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM