Как выполнить модульное тестирование функций побочных эффектов в Clojure?

Этот вопрос не о конкретных библиотеках (хотя некоторые из них будут использованы в конце), а о том, как структурировать код приложения, чтобы сделать возможным модульное тестирование функций побочных эффектов. Если мы должны сделать это вообще?

Очевидно, что тестирование чистых функций, свободных от побочных эффектов, понятно и просто, вы пропускаете ввод и утверждаете вывод.

Есть 2 (очень грубо) типа тестирования, юнит и интеграция. Давайте сосредоточимся на модульном тестировании здесь.

Итак, если у вас есть функция, которая читает из файла или записывает в файлы (используя slurp/spit, например), или работа с базой данных, кольцевым приложением или каналами core.async, как проводить модульное тестирование таких вещей в Clojure? Участвуют ли издевательства, если да, как они должны быть определены? Здесь binding, with-{redefs, redefs-fn, local-vars} участвует? Должен ли я определить defprotocol для того, чтобы усовершенствовать (иначе макет?) реализацию во время модульного тестирования?

Одна из ценностей тестирования (главная ценность?) Заключается в том, чтобы навязать лучший дизайн кода приложения, поэтому, возможно, тестирование в Clojure является особенным в том смысле, что вы вынуждены структурировать код приложения определенным образом, чтобы сделать Возможны ли функции юнит-тестирования в Clojure?

Или я полностью упускаю суть?

PS1: Мне комфортно работать и разрабатывать с приложениями Clojure для малого / среднего размера (наверняка еще предстоит), хотя тестирование мне до сих пор не совсем понятно.

PS2: Еще одна важная тема - интеграционное тестирование в Clojure, но оно заслуживает отдельного вопроса SO.

2 ответа

В общем, вы тестируете код с побочными эффектами, реализуя артефакты настройки и демонтажа для ваших тестов. Они создают базовое / начальное состояние и помогают оценить результаты.

Я настоятельно рекомендую вам избегать with-redefs и друзья, если это вообще возможно. Мы используем протоколы для большинства всех наших взаимодействий с внешними сервисами и везде внедряем зависимости, поэтому тестирование очень просто. Конечно, мы все еще пытаемся сделать функции максимально чистыми и тщательно управлять эффектами, но в целом мы были довольны протоколами, когда это было необходимо.

Другие вопросы по тегам