Способ связать тест, один за другим в спину?
Lein test
запускает мои функции в случайном порядке.
У меня есть две функции, которые изменяют одни и те же данные. Мне нужно, чтобы первый работал первым, а второй после этого. Порядок в моем тесте
Пример:
;;===============my file=============
;;this fails if x and y are not found.
(defn create-data [x y]
(go add x y))
;;if the update function doesn't find x and y it adds them so create-data fails when it runs after update-data
(defn update-data [x y]
(go update x y))
;;======my file test=======
(deftest create-test
(testing "this should run first"
(is (= 20 create-data)))
(deftest create-test
(testing "this should run second"
(is (= 20 update-data)))
поэтому я подумал, что создание одного теста для обеих функций заставит его работать, но это не так.
(deftest test-create-update.
(testing "this should run second"
(is (= 20 create-data))
(is (= 20 update-data)))
Я хочу что-то, что будет запускать обе функции, но сначала запустит create-data, и независимо от результата (независимо от того, пройден он или нет), будет запущен update-data. Мне нужны оба в моем тесте. Индивидуально они работают. но мне нужно автоматическое тестирование.
2 ответа
Вы можете использовать тестовые устройства для создания и разрушения тестовых сред. Это можно сделать для всех тестов или для каждого отдельного теста.
Смотрите использование светильников:
; Here we register my-test-fixture to be called once, wrapping ALL tests
; in the namespace
(use-fixtures :once my-test-fixture)
Если вы хотите навести порядок в нескольких пространствах имен, вы можете заключить их в my-test-fixture
,
Ваша интуиция для создания одного теста для обеих функций - хороший подход. Проблема, с которой вы столкнулись, скорее всего, не связана с тестированием.
Код, который вы разместили (go add x y)
предположить, что вы используете core.async. Есть некоторые проблемы:
- Блоки go возвращают канал, и код в них выполняется "некоторое время спустя", поэтому, если вы не заблокируете результат, вам не гарантировано, что что-то произошло.
(go add x y)
не выполняет никаких функций, он просто возвращает y. Вы, вероятно, хотите(!< (go (add x y)))
- Если add не изменяет какое-либо состояние через атом или ref или подобное, ничего не изменится.
Я считаю, что настоящая проблема здесь с кодом, а не с тестами. Или, если код "работает", то это потому, что у вас нет блокировки в тесте. Можете ли вы предоставить более подробную информацию о том, что go
а также add
в вашем контексте?