Способ связать тест, один за другим в спину?

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. Есть некоторые проблемы:

  1. Блоки go возвращают канал, и код в них выполняется "некоторое время спустя", поэтому, если вы не заблокируете результат, вам не гарантировано, что что-то произошло.
  2. (go add x y) не выполняет никаких функций, он просто возвращает y. Вы, вероятно, хотите (!< (go (add x y)))
  3. Если add не изменяет какое-либо состояние через атом или ref или подобное, ничего не изменится.

Я считаю, что настоящая проблема здесь с кодом, а не с тестами. Или, если код "работает", то это потому, что у вас нет блокировки в тесте. Можете ли вы предоставить более подробную информацию о том, что go а также add в вашем контексте?

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