2013-11-21 53 views
4

我想測試一個名爲Login的方法,當用戶和密碼參數正確時,設置兩個會話變量和三個cookie的值,最後返回true。在這個測試中是否有多個斷言錯誤?

我一直在閱讀關於單元測試的幾篇文章,但不知何故,這並沒有讓我的案例完全清楚。我知道每個單元測試應該只有一個斷言,儘管只要測試一個「邏輯概念」就可以使用多個測試。

只有當它正確設置每個會話變量和cookie並返回預期值時,登錄方法纔是正確的,因此我不確定是否可以一次檢查所有這些值(這會導致我使用六個在單元測試中斷言,我認爲有點骯髒),或者我應該在不同的測試中分別檢查每個會話變量和cookie的值。

[TestMethod()] 
public void SuccessfulLoginTest() 
{ 
    // Arrange. 
    String username = "foo"; 
    String password = "correct password"; 
    Boolean remember = true; 

    // Act. 
    Boolean actual = Login(username, password, remember); 

    // Assert. 
    Assert.IsTrue(actual); 
    Assert.AreEqual("foo", HttpContext.Current.Session["Username"]); 
    Assert.AreEqual(1, HttpContext.Current.Session["Group"]); 
    Assert.AreEqual("foo", HttpContext.Current.Response.Cookies["Username"].Value); 
    Assert.AreEqual("en", HttpContext.Current.Response.Cookies["Lang1"].Value); 
    Assert.AreEqual("es", HttpContext.Current.Response.Cookies["Lang2"].Value); 
} 
+4

看起來不錯! – Heinzi

+0

這個想法,每個測試用例應該只有一個斷言[是愚蠢的](http://stackoverflow.com/a/20300843/545127)。 – Raedwald

回答

3

對我也很好。我不確定你認爲每個單元測試應該只有一個Assert的概念。這聽起來像是一個「象牙塔」的規則,這只是簡單的傻海事組織。如果您的方法在給定特定輸入的情況下設置了一堆變量,那麼您應該檢查給定該輸入的所有變量。編寫六個不同的單元測試(和相關的設置代碼)似乎非常低效。

但是,當談到編寫軟件時,我傾向於傾向於學術「正確性」的實用主義。

+0

規則說每個測試都有一個*邏輯斷言*,這已經被OP提及。這不是「學術」,也不是「傻」。 – BartoszKP

+2

也許「每個測試一個邏輯斷言」意味着每個斷言一個子句,所以不要使用'Assert(theSkyIs(blue)&& theSeaIs(deep));'但是使用Assert(theSkyIs(blue));'和'Assert theSeaIs(深));'。 – AdrianHHH

-1

讓您的條件與布爾變量相匹配,如果所有條件都滿足,那麼布爾變量應該返回true。

資產這個布爾變量

bool AreAllConditionsFulfilled = condition1 && condtionCheckingSessionVariablesOne && conditionCheckingSessionVariablesTwo 

另外我建議有單獨的測試用例測試每個會話變量,並聲稱,如果他們是正確的。

[Test] 
public void TestUserNameSessionVariable() 
{ 
//Login Code 
Assert.AreEqual("foo", HttpContext.Current.Session["Username"]); 
} 
3

你已經正確注意到,該一個斷言規則關注概念性的說法,沒有裸露的來電來Assert方法。當一個邏輯斷言由許多斷言組成並且還使得測試更可讀時,這是一個很好且常見的技巧,它將斷言封裝在實用程序方法中。你的情況可能與此類似:

void AssertSessionIsValid(string username, int group, ...) 
{ 
    Assert.AreEqual(username, HttpContext.Current.Session["Username"]); 
    Assert.AreEqual(group, HttpContext.Current.Session["Group"]); 
    ... 
} 

有很多框架,增加你的測試的可讀性,像Shouldly幫助。

1

我會建議斷言你關心的所有事情都是'正在工作',不過是這樣。太少斷言,你的測試將忽略清楚的功能破壞;太多了,你的測試會變得脆弱,並且在一些不相關的細節變化時不必要地突破。

相關問題