Начну с того, что я довольно новичок в модульном тестировании и хотел бы начать использовать подход TDD, но сейчас я пишу модульные тесты для некоторых существующих классов, чтобы проверить их функциональность во всех случаях.
Я смог протестировать большую часть своего кода, используя макеты NUnit и Rhino без особых проблем. Однако мне было интересно узнать о функциях модульного тестирования, которые в конечном итоге вызывают много других методов в том же классе. Я не могу сделать что-то вроде
classUnderTest.AssertWasCalled(cut => cut.SomeMethod(someArgs))
потому что тестируемый класс не подделка. Кроме того, если тестируемый метод вызывает другие методы в тестируемом классе, которые, в свою очередь, также вызывают методы в том же классе, мне понадобится подделать кучу значений только для проверки метода «верхнего уровня». Поскольку я также провожу модульное тестирование всех этих «под-методов», я могу предположить, что «SomeMethod» работает, как и ожидалось, если он проходит модульное тестирование и ему не нужно беспокоиться о деталях этих низкоуровневых методов.
Вот пример кода, с которым я работал, чтобы проиллюстрировать мою точку зрения (я написал класс для управления импортом / экспортом файлов Excel с использованием NPOI):
public DataSet ExportExcelDocToDataSet(bool headerRowProvided)
{
DataSet ds = new DataSet();
for (int i = 0; i < currentWorkbook.NumberOfSheets; i++)
{
ISheet tmpSheet = currentWorkbook.GetSheetAt(i);
if (tmpSheet.PhysicalNumberOfRows == 0) { continue; }
DataTable dt = GetDataTableFromExcelSheet(headerRowProvided, ds, tmpSheet);
if (dt.Rows.Count > 0)
{
AddNonEmptyTableToDataSet(ds, dt);
}
}
return ds;
}
public DataTable GetDataTableFromExcelSheet(bool headerRowProvided, DataSet ds, ISheet tmpSheet)
{
DataTable dt = new DataTable();
for (int sheetRowIndex = 0; sheetRowIndex <= tmpSheet.LastRowNum; sheetRowIndex++)
{
DataRow dataRow = GetDataRowFromExcelRow(dt, tmpSheet, headerRowProvided, sheetRowIndex);
if (dataRow != null && dataRow.ItemArray.Count<object>(obj => obj != DBNull.Value) > 0)
{
dt.Rows.Add(dataRow);
}
}
return dt;
}
...
Вы можете видеть, что ExportExcelDocToDataSet (в данном случае мой метод «верхнего уровня») вызывает GetDataTableFromExcelSheet , который вызывает GetDataRowFromExcelRow , который вызывает пару других методы, определенные в этом же классе.
Итак, какова рекомендуемая стратегия для рефакторинга этого кода, чтобы сделать его более модульным для тестирования без необходимости заглушать значения, вызываемые субметодами? Есть ли способ подделать вызовы метода в тестируемом классе?
Заранее спасибо за любую помощь или совет!