Есть ли способ иметь фикстуры, специфичные для определенных тестов, а не для всех в данном пространстве имен?

точно так же, как midje позволяет нам обернуть facts в форму with-state-changes, чтобы указать, что должно выполняться конкретно до, вокруг или после них или содержимого, как можно добиться того же с помощью clojure.test


person Amogh Talpallikar    schedule 24.05.2016    source источник


Ответы (1)


фикстуры в clojure.test — это функции, которые принимают функцию в качестве аргумента, выполняют некоторую настройку, вызывают функцию, а затем выполняют некоторую очистку.

тесты (созданные с помощью deftest) — это функции, которые не принимают аргументов и запускают соответствующие тесты.

Таким образом, чтобы применить фикстуру к тесту, вы просто обертываете этот тест в фикстуру.

user> (require '[clojure.test :refer [deftest is testing]])
nil

функция для проверки:

user> (def add +)
#'user/add

тест для него:

user> (deftest foo (is (= (add 2 2) 5)))
#'user/foo

создайте приспособление, которое изменяет математику, чтобы тест мог пройти:

user> (defn new-math-fixture [f]
        (println "setup new math")
        (with-redefs [add (constantly 5)]
          (f))
        (println "cleanup new math"))
#'user/new-math-fixture

без приспособления тест не пройден:

user> (foo)

FAIL in (foo) (form-init5509471465153166515.clj:574)
expected: (= (add 2 2) 5)
  actual: (not (= 4 5))
nil

и если мы изменим математику, наш тест в порядке:

user> (testing "new math"
        (new-math-fixture foo))
setup new math
cleanup new math
nil
user> (testing "new math"
        (deftest new-math-tests
          (new-math-fixture foo)))
#'user/new-math-tests
user> (new-math-tests)
setup new math
cleanup new math
nil
person Arthur Ulfeldt    schedule 24.05.2016
comment
есть ли способ применить фикстуры к определенной группе тестов, а не ко всем из них в пространстве имен. - person Amogh Talpallikar; 25.05.2016
comment
Замените foo на #(test1 test2 test3) в приведенном выше примере. - person Arthur Ulfeldt; 25.05.2016