public void SaveStatus(Status newStatus);
上述方法將一些新狀態保存到數據庫中。是否應返回類似布爾標誌的內容來指示保存操作的成功或失敗。存儲庫層方法返回類型
在寫一個單元測試,我得到了什麼我主張一個問題,SaveStatus()
是否成功與否。如果沒有拋出異常,在單元測試的情況下可以認爲是成功的。
什麼是解決這個問題的最佳做法?
public void SaveStatus(Status newStatus);
上述方法將一些新狀態保存到數據庫中。是否應返回類似布爾標誌的內容來指示保存操作的成功或失敗。存儲庫層方法返回類型
在寫一個單元測試,我得到了什麼我主張一個問題,SaveStatus()
是否成功與否。如果沒有拋出異常,在單元測試的情況下可以認爲是成功的。
什麼是解決這個問題的最佳做法?
NO
的method's名字讓我們清楚知道它的合同:它必須保存狀態。當一個方法出於任何原因不能做它必須做的事時,它必須拋出一個異常,這就是OOP的工作方式。如果返回錯誤代碼或標誌,你將結束其在所有呼叫者以下:
if(xxx.SaveStatus(newStatus)){
// do something
}
else
{
// and here.. what? return another boolean???? Ignore it???? ummmm
}
如果失敗的話,你會得到一個例外,那就夠了。
在你的UT,你必須斷言新的狀態保存,要做到這一點,你必須使用例如或者任何你正在使用存儲庫來嘲笑你的數據庫訪問。
不,這是沒有意義的。返回函數 的值返回void是無效的,但您可以返回布爾值。從你所稱的功能獲得所需的輸出只不過是它的成功。
如果你關心的成功,則是你可以返回一個布爾值,表示成功/失敗。另一個可能的選擇是拋出異常。我更喜歡使用布爾值作爲返回值而不是拋出異常。如果在該方法中發生異常,我將在SaveStatus
方法內處理它們並返回一個錯誤。
我之所以不傾向於在這種情況下拋出異常是因爲它可以在你的應用程序的性能產生負面影響。微軟標準規定「for code that routinely fails, you can use design patterns to minimize performance issues」。
我要和你的第二點不同意,我不會考慮DB故障爲「*例行*」失敗。您不應該*期望*您的數據庫失敗,因此異常更合適。 – James
不,它不應該。這將是明顯違反Command Query Separation。一種方法應該返回或突變某種狀態,從來都不會。
由於您使用.NET,你應該利用例外指示失敗。
拋出一個異常來指示失敗。這允許您包含應用程序邏輯可以用來決定如何處理故障的故障細節。要@ Hexxagonal的角度來看,這可能是一個壞的技術,如果代碼失敗了很多,但如果你的版本庫層失敗了不少,性能不會是你最關心的問題。
進行單元測試,模擬所述存儲機制(數據庫?),並驗證該模擬呼叫。我爲此推薦Moq。
你可以提出一個關於CQS的評論,把最後的東西放入。:) –