ChangeAssert簡單地通過映射獲取對象的狀態,因此,稍后你可以斷言到除了你指出的幾個具體屬性其他的沒變。
恭喜,你完成了你的第一個測試用例。完成一個,還有很多很多等著。
為什么說是“一個”測試用例?
那8個測試只是完成了覆蓋FirstName屬性從“Adam”修改成“Bob”這一個場景,在其他的值沒有在錯誤狀態、LastName不為null或空的情況下。讓我們看看測試用例的完整清單:
●將FirstName值設置為“Adam”
●將FirstName值設置為null
●將FirstName 設為空串
●在LastName值為null的情況下,執行case1-3
●在LastName 為空串的情況下,執行case1-3
●在FirstName值以null開頭的情況下,執行case1-5
●在FirstName值以空串開頭的情況下,執行case1-5
目前我們看到了27個不同的場景。如果每個場景需要8個不同測試,僅僅為這一個屬性,我們需要執行至多216個測試。根據這種思路,這是相當瑣碎的一段代碼。因此我們該怎么做呢?
測試也有代碼味道
回看第一個測試用例的8個測試,它們都有同樣的設置和運算。唯一的不同是我們寫的斷言。在業界這個被稱為一個代碼味道。事實上,根據維基百科所列的這里應該有兩個代碼味道:
●Duplicated code
●重復的代碼
●Excessively long identifiers
●過長的標識符
我們可以通過將斷言合并到一個測試來輕松地消除這兩個代碼味道:
[TestMethod]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public void Person_FirstName_Set() { var person = new Person( "Adam" , "Smith" ); var eventAssert = new PropertyChangedEventAssert(person); var errorsChangedAssert = new ErrorsChangedEventAssert(person); var changeAssert = new ChangeAssert(person); person.FirstName = "Bob" ; Assert.AreEqual( "Bob" , person.FirstName, "FirstName setter failed" ); Assert.AreEqual( "Bob Smith" , person.FullName, "FullName not updated with FirstName changed" ); Assert.IsTrue(person.IsChanged, "IsChanged flag was not set when FirstName changed" ); eventAssert.Expect( "IsChanged" ); eventAssert.Expect( "FirstName" ); eventAssert.Expect( "FullName" ); errorsChangedAssert.ExpectNothing( "Expected no ErrorsChanged events" ); changeAssert.AssertOnlyChangesAre( "FirstName" , "FullName" , "IsChanged" ); } |
原文轉自:http://www.anti-gravitydesign.com