2016-01-14 81 views
0

我想知道它應該如何測試測試,因爲如果我想測試其中的一個,它迫使我在每個測試中放兩個斷言(它可能會長大)。更新自己的變量的函數

internal class Foo 
{ 
    public int A { get; set; } 
    public int B { get; set; } 

    public void UpdateVars(int a, int b) 
    { 
     A = a; 
     B = b; 
    } 
} 

我應該這樣測試嗎?

private Foo sut; 

[TestCase(0, 1)] 
[TestCase(-1, 1)] 
[TestCase(int.MaxValue, 1)] 
public void ShouldUpdateStatsAndCheckA(int a, int b) 
{ 
    sut.UpdateVars(a, b); 

    sut.A.ShouldBe(a); 
} 

[TestCase(1, 0)] 
[TestCase(1, -1)] 
[TestCase(1, int.MaxValue)] 
public void ShouldUpdateStatsAndCheckB(int a, int b) 
{ 
    sut.UpdateVars(a, b); 

    sut.B.ShouldBe(b); 
} 

對我來說這似乎很可怕。

+0

嗯,這裏的「正確」的含義是廣泛的,因爲你從來沒有說過他們應該做的(他們是否應該設置變量爲零,如果傳遞的值不是一個有效的數字或將它們設置爲相應數量的,否則的話是的,他們可能工作)。另外,如果方法趨於增長,則必須考慮其他方法和設計模式。方法應該保持簡短,以便易於測試和維護。 –

+0

你最好還是每個測試都有一個斷言。一個(一組)測試來對A進行斷言,另一個對A進行斷言。另一個對B進行斷言。這樣,當A失敗時,你知道它是* A *仍然*得到B的測試執行。 –

+2

Kopranb是正確的 - 正確性意味着你已經實現了一個規範,並且你沒有給我們規範。這兩種方法的規格是什麼?一旦你有了一個規範,那麼你可以編寫測試用例來確定代碼是否正確。 –

回答

0

這就是測試它一個很好的方式,因爲你應該儘量避免有很多聲稱在一個單一的測試。但是,這不應該被視爲一個規則,而是作爲一個建議。通常每個測試都會聲明一個預期的行爲。

如果你發現自己有創造大量的測試,這樣你不把在一個測試多個斷言,那麼它很可能是你的模式是錯誤的,你有方法做太多。

this blog文章,瞭解如何處理多個斷言,可能的幫助。