2016-03-23 1 views
1

Lein test выполняет мои функции в случайном порядке.Способ подключения теста, один за другим в clojure?

У меня есть две функции, которые изменяют одни и те же данные. Мне нужно, чтобы первый из них запускался первым, а второй - после него. Порядок в моем тесте firles

Пример:

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

+0

Я думаю, что 'clojure.test' просто захватывает все тестовые функции из пространства имен и не сохраняет порядок, в котором они были определены. Вы уверены, что ваш случай с несколькими выражениями 'is' в одном' testing' не работает? Я попробовал это, и он работает для меня (второй 'is' оценивается, даже если первый из них не работает). Кроме того, вы не вызываете 'create-data' и' update-data', а просто сравниваете их как объекты функций с номером 20. Не ставьте ваши тесты, которые требуют определенного порядка в один 'deftest', но вложены в разные' test' случаи? –

+0

Я думаю, что самые деликатные случаи должны быть самодостаточными. Если вы хотите обеспечить соблюдение порядка, разве вы не думаете, что вам лучше положить все это в один раз? –

ответ

2

Вы можете использовать испытательные приборы для создания и отключения тестовых сред. Это можно сделать для всех тестов или для каждого отдельного теста.

См use-fixtures:

; 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.

0

Ваша интуиция для создания одного теста для обеих функций - прекрасный подход. Проблема, с которой вы сталкиваетесь, скорее всего не связана с тестированием.

Код, который вы отправили (go add x y), предположите, что вы используете core.async. Возникли некоторые проблемы:

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

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

+0

go и add - это просто случайные имена, потому что я не хотел писать фактический код, над которым я работал. –

Смежные вопросы