我是單元測試新手,目前在找到一種體面的方法來測試包含分支的方法時遇到了問題。包含條件條件的單元測試方法的最佳實踐
我創建了一個小的演示方法,我希望可以用來解釋這個問題。
public void ExportAccounts()
{
int emptyAccounts = 0;
int nonEmptyAccounts = 0;
int errorous = 0;
string outputPath = this.GetOutputPath();
Account[] accounts = this.MyWebserviceAdapter.GetAccounts();
foreach(Account account in accounts)
{
try
{
if(account.Amount > 0)
{
this.ExportNonEmpty(outputPath, account);
nonEmptyAccounts++;
} else {
this.ExportEmptyAccount(outputPath, account);
emptyAccounts++;
}
} catch(Exception e) {
logger.error(e);
errorous++;
}
}
logger.debug(string.Format("{0} empty/{1} non empty/{2} errorous", emptyAccounts, nonEmptyAccounts, errorous));
}
我可以模擬MyWebserviceAdapter以返回預定義的帳戶列表。我是否應該在同一個測試中輸入空的和非空的賬戶清單,還是應該單獨進行測試?
另外我的ExportNonEmpty()和ExportEmpty()方法是私有的,但是將文件寫入文件系統。我應該提供一個模擬FileProvider,以便文件系統不被觸及?
我應該公開ExportNonEmpty()和ExportEmpty()以便能夠分別測試這些嗎?這些方法還包含一些if-then-else語句,並可以引發異常和異常。
我發現如果我爲每個代碼路徑創建一個測試我有從一個測試複製代碼到另一個 - 生成嘲笑等..不是有點奇怪?
我應該公開計數器變量作爲出變量,以便能夠在調用方法後驗證它們嗎?
this.GetOUtputPath()通過靜態的ConfigurationManager從配置文件中獲取值。我應該a)通過爲testt下的類創建一個部分模擬並覆蓋GetOutputPath方法或者b)創建我自己的可以被嘲笑的配置適配器來模擬這一點?
我正在使用nunit和Rhino Mocks。
那麼你會爲每個測試向量有一個單獨的測試方法嗎?這樣做會導致許多嘲笑必須複製到我所推測的每種測試方法中。你可以評論你將如何做到這一點? – Fadeproof 2008-12-19 13:36:06