Я не думаю, что вы должны тратить время на тестирование вещей, которые не являются вашим кодом. Это выбор дизайна, а не выбор тестирования, будь то обработка ошибок базовой структуры или их распространение до вызывающей стороны. FWIW, я думаю, что вы правы, чтобы позволить им размножаться. Тем не менее, после того, как вы приняли решение о разработке, ваше модульное тестирование должно охватывать ваш код (и охватывать его хорошо) без тестирования базовой структуры. Использование внедрения зависимости и фиктивного потока, вероятно, также является хорошей идеей.
[EDIT] Пример внедрения зависимости (для получения дополнительной информации см. Ссылку выше)
Мы не используем внедрение зависимостей:
public class CvsReader {
private string filename;
public CvsReader(string filename)
{
this.filename = filename;
}
public string Read()
{
StreamReader reader = new StreamReader( this.filename );
string contents = reader.ReadToEnd();
.... do some stuff with contents...
return contents;
}
}
С внедрением зависимостей (конструктор) мы делаем:
public class CvsReader {
private IStream stream;
public CvsReader( IStream stream )
{
this.stream = stream;
}
public string Read()
{
StreamReader reader = new StreamReader( this.stream );
string contents = reader.ReadToEnd();
... do some stuff with contents ...
return contents;
}
}
Это позволяет легко тестировать CvsReader. Мы передаем экземпляр, реализующий интерфейс, от которого мы зависим, в конструкторе, в данном случае IStream. Из-за этого мы можем создать другой класс (возможно, фиктивный класс), который реализует IStream, но не обязательно выполняет файловый ввод-вывод. Мы можем использовать этот класс для передачи нашему читателю любых данных, которые мы хотим, без привлечения какой-либо базовой структуры. В этом случае я бы использовал MemoryStream, так как мы просто читаем из него. Однако мы хотели бы использовать фиктивный класс и предоставить ему более богатый интерфейс, который позволяет нашим тестам настраивать ответы, которые он дает. Таким образом, мы можем тестировать код, который пишем, и вообще не задействовать базовый код платформы. В качестве альтернативы мы могли бы также передать TextReader, но обычный шаблон внедрения зависимостей использует интерфейсы, и я хотел показать шаблон с интерфейсами. Возможно, лучше передать TextReader, поскольку приведенный выше код все еще зависит от реализации StreamReader.