Тестирование класса с потоками - PullRequest
1 голос
/ 01 сентября 2010

Меня интересует лучший способ написания модульных тестов для класса, публичный 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 () манипулирует внутренним состоянием, которое, я не думаю, должно быть делом модульного теста.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2010

Да, я бы сказал, что это совершенно нормально.

Тестируйте любым способом, который вы найдете практическим . Я считаю, что слишком много догм в отношении тестирования точно одной вещи в каждом методе тестирования. Это прекрасный идеал, но иногда он не настолько практичен, как чуть менее чистые альтернативы.

0 голосов
/ 01 сентября 2010

На мой взгляд, тесты обычно следуют шаблону типа «настройка - эксплуатация - проверка - разрыв».

Я сконцентрировал большинство общих настроек и функций в соответствующих функциях.

Но для конкретной настройки теста и демонтажа это часть метода теста.

Я не вижу ничего плохого в подготовке состояния тестируемого объекта с использованием вызовов методов этого объекта. В ООП я бы не пытался отделить состояние от операций, поскольку парадигма делает все возможное, чтобы объединить их и, если возможно, даже скрыть состояние. На мой взгляд, тестируемым модулем является Class - состояние и методы.

Я делаю визуальное различие в коде, отделяя блок настройки от блока управления и блок проверки пустой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...