Очевидно, что тесты не обязательно выполняются по порядку:
(deftest a-test
(println "a")
(def inner "hello"))
(deftest b-test
(println "b")
(println "inner" inner))
Testing tic-tac-toe.core-test
b
inner #object[clojure.lang.Var$Unbound 0x37acbc9e Unbound: #'tic-tac-toe.core-test/inner]
a
Ran 2 tests containing 0 assertions.
0 failures, 0 errors.
=> {:test 2, :pass 0, :fail 0, :error 0, :type :summary}
Обратите внимание, как сначала печатается буква "b".Это означает, что ваша переменная не могла быть инициализирована к тому времени, когда она была необходима.
Я бы исправил это, объявив mock-user-id
верхнего уровня, а затем использовал бы его в обоих тестах, чтобы порядок испытаний не имел значения.Вы можете обернуть его в delay
, если не хотите, чтобы он инициализировался до тех пор, пока он абсолютно не понадобится:
; delay will delay initialization until it's first used
(def mock-user-id (delay (user->db {:name "Bob"})))
(deftest test-user->db
(testing "Adding a new user record to db"
(is (uuid? @mock-user-id)))) ; @ to force the delay to run its body the first time
(deftest test-db->user
(testing "Getting a user record from db"
(let [user (db->user @mock-user-id)] ;; mock-user-id is unbound :-/
(is (instance? User user))
(is (contains? user :id))
(is (contains? user :name))
(is (= @mock-user-id (:id user)))
(is (= "Bob" (:name user))))))