Я новичок в юнит-тестировании, и в настоящее время у меня проблема с поиском достойного способа тестирования методов, содержащих ветви.
Я создал небольшой демонстрационный метод, который, я надеюсь, можно использовать для объяснения проблемы.
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 и могут генерировать исключения и еще много чего.
Я нахожу, если я создаю тест для каждого кодового пути, я копирую код из одного теста в другой - генерирую макеты и т. Д. Не правда ли, это немного странно?
Должен ли я выставить переменные счетчика как переменные out, чтобы иметь возможность проверить их после вызова метода?
this.GetOUtputPath () извлекает значения из файла конфигурации через ConfigurationManager, который является статическим. Должен ли я а) смоделировать это либо путем создания частичного макета для класса под тестом и перезаписать метод GetOutputPath, либо б) создать свой собственный ConfigurationAdapter, который можно макетировать?
Я использую Nunit и Rhino Mocks.