2012-05-28 101 views
2

假設我們有一個訂單類與方法稱爲批准。當調用此方法時,它會檢查某些條件並將訂單置於Approved狀態或引發異常。在服務層,我們已經得到的東西是這樣的:狀態與基於交互的測試

var order = _repository.Single(o => o.ID == orderID); 
order.Approve(); 
_context.SaveChanges(); // or _session.SaveChanges(); 

有2種方式來測試這個方法,我想聽聽您對此的見解:

解決方案1 ​​:存根存儲庫返回一個Order對象。然後聲明訂單處於「已批准」狀態。

解決方案2:存根存儲庫以返回模擬訂單對象。斷言Approve()方法被調用。

解決方案1更簡單,我個人更傾向於基於狀態的測試,以基於交互的測試,因爲後者可以針對實現細節並應該避免。但是,我認爲測試指定訂單處於Approved狀態並不是此服務方法的關注點。我認爲我們需要一個單獨的Order類測試方法來測試是否拋出異常或Order的狀態改變爲Approved。

解決方案2可能聽起來合乎邏輯,因爲我們將審批訂單的責任委託給訂單類本身。因此,也許我們需要針對此服務方法進行2次測試:一次確保它將審批訂單的任務委託給訂單類,並確保它保存更改。

你對此有何認識?你更喜歡哪種解決方案?

乾杯

回答

4

單元測試是測試觀察到的行爲是否符合預期/規範。

您的問題的答案歸結爲您認爲在此情況下的「預期行爲」:a)如果預期的行爲是在調用服務方法後訂單處於批准狀態,則測試狀態; b)如果預期的行爲是批准操作被委託,則測試方法調用。

在這兩種情況下,您都需要測試Order對象的行爲(以便呼叫Approve()將狀態更改爲已批准狀態)。

第二種解決方案可以很好地解耦兩個對象的行爲,但是如果訂單可以處於批准狀態的多種方式(並且這就是您正在測試的內容 - 情況a)),則你無謂地限制了接受的行爲。

此外,我會創建一個單獨的測試用於測試保存部分,如果這不是審批部分必需的