假設我們有一個訂單類與方法稱爲批准。當調用此方法時,它會檢查某些條件並將訂單置於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次測試:一次確保它將審批訂單的任務委託給訂單類,並確保它保存更改。
你對此有何認識?你更喜歡哪種解決方案?
乾杯