В тесте, который изолирует испытуемого от его обычной среды, вы часто будете видеть шаблон input -> logic -> output
, поскольку входные данные должны быть предоставлены средой, а тест равен среда, которую испытывает субъект.
TDD
очень часто использует изолированные тесты; они, как правило, бывают как быстрыми, так и смущающими параллелями, что означает, что запуск их на этапе проектирования имеет низкую альтернативную стоимость.
String getName (int id)
{
// read the name of a staffmember out of the DB and return it
}
В таком примере, как этот, мы, как правило, склонялись бы к разработке, в которой база данных "конфигурируется", и в нашем тесте мы предоставили бы нашу базу данных в памяти, предварительно загруженную в правильное состояние.
// Copy input to database
// connect test subject to database
// invoke query, thereby retrieving the output
Это один и тот же шаблон, просто вырезанный по-разному.
В во многих случаях мы можем ввести в наш проект некоторую абстракцию для базы данных и сделать эту абстракцию, а не базу данных, настроенной зависимостью. Таким образом, вместо использования абстракции, которая обращается к базе данных, у нас может быть гораздо более простая реализация, которая жестко запрограммирована для возврата некоторого значения.
Такая вещь иногда называется двойной тест .
// Use the input to initialize the test double
// connect test subject to test double
// invoke query, thereby retrieving the output
Снова появляется та же картина, детали "логики" несколько меняются.
logic
из input -> logic -> output
не обязательно ваш производственный код. Обычно пишут тесты, которые интегрируются с фасадом, который координирует протокол взаимодействия между испытуемым и его (удвоенными) зависимостями.
(Тесты, как и производственный код, имеют дизайн - инвестирование в хороший дизайн теперь может принести значительную прибыль в течение всего жизненного цикла теста).