Меня интересует лучший способ написания модульных тестов для класса, публичный API которого включает в себя какой-то поток, например:
public class PaginatedWriter {
public void AppendLine(string line) { ... }
public IEnumerable<string> GetPages() { ... }
public int LinesPerPage { get; private set; }
}
Этот класс разбивает текстовые строки на указанное количество строк на странице. Чтобы протестировать этот класс, у нас может быть что-то вроде:
public void AppendLine_EmptyLine_AddsEmptyLine() { ... }
public void AppendLine_NonemptyLine_AddsLine() { ... }
public void GetPages_ReturnsPages() {
writer.AppendLine("abc");
writer.AppendLine("def");
var output = writer.GetPages();
...
}
Теперь мой вопрос: нормально ли делать вызовы AppendLine () в последнем тестовом методе, даже если мы тестируем метод GetPages ()?
Я знаю, что одно из решений в таких ситуациях состоит в том, чтобы сделать AppendLine () виртуальным и переопределить его, но проблема в том, что AppendLine () манипулирует внутренним состоянием, которое, я не думаю, должно быть делом модульного теста.