我是单元测试新手,目前在找到一种体面的方法来测试包含分支的方法时遇到了问题。包含条件条件的单元测试方法的最佳实践
我创建了一个小的演示方法,我希望可以用来解释这个问题。
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