Я не думаю, что вам нужно тратить время на тестирование вещей, которые не являются вашим кодом. Это выбор дизайна, а не выбор тестирования, независимо от того, обрабатывать ошибки базового фреймворка или позволять им распространяться до вызывающего. FWIW, я думаю, вы правы, чтобы позволить им распространяться. Однако после того, как вы приняли решение по дизайну, ваше модульное тестирование должно охватывать ваш код (и хорошо его покрывать), не тестируя базовую структуру. Использование dependency injection и флеш-поток, вероятно, тоже хорошая идея.
[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.Из-за этого мы можем создать еще один класс (возможно, класс mock), который реализует IStream, но не обязательно выполняет ввод/вывод файлов. Мы можем использовать этот класс для подачи нашему читателю любых данных, которые мы хотим, без участия какой-либо базовой структуры. В этом случае я бы использовал MemoryStream, так как мы просто читаем его. Тем не менее, мы хотели использовать класс mock и дать ему более богатый интерфейс, который позволяет нашим тестовым настройкам настраивать ответы, которые он дает. Таким образом, мы можем протестировать код, который мы пишем, и вообще не включать базовый код. В качестве альтернативы мы могли бы также передать TextReader, но обычный шаблон инъекции зависимостей использует интерфейсы, и я хотел показать шаблон с интерфейсами. Возможно, передача в TextReader будет лучше, поскольку вышеприведенный код все еще зависит от реализации StreamReader.
Я согласен с tvan, что необходимо нарисовать линию, но в конечном счете, вы правы, линия должна быть нарисована с точки зрения клиента. Например, я не перечислил тест «закрыть после использования», потому что не было никакого вопроса, который можно было бы ожидать. – harpo 2008-10-14 23:23:47