我想检查是否使用了正确的实例 但是当repl给我真实时,实际测试返回nil。 Idk为什么
(ns my-app.queue)
(def queue (atom clojure.lang.PersistentQueue/EMPTY))
(ns my-app.queue-test
(:require [my-app.queue :as sut]
[clojure.test :refer :all]))
(deftest queue-type-test
(is (instance? clojure.lang.PersistentQueue @sut/queue)))
;repl output
;(instance? clojure.lang.PersistentQueue @sut/queue) ;=> true
命令lein test
给了我:
FAIL in (queue-type-test) (queue_test.clj:6)
expected: (instance? clojure.lang.PersistentQueue (clojure.core/deref sut/queue))
actual: nil
我知道测试本身并不是很有用,但我无法弄清楚为什么会出现这种情况。
答案 0 :(得分:0)
tl; dr:is
和@
都是宏。最明显的解决方法是:
(deftest queue-type-test
(let [queue @sut/queue]
(is (instance? clojure.lang.PersistentQueue queue)))
clojure.test
文档不会让它立即变得明显,但是is
是一个非常棘手的宏,可以看到它的正文。这是docstring的一个片段:
user> (is (= 5 (+ 2 2)))
FAIL in (:1)
expected: (= 5 (+ 2 2))
actual: (not (= 5 4))
false
注意actual: (not (= 5 4))
。很明显,它没有评估=
,因此它可以向我们展示(+ 2 2)
的结果。 Here是assert-expr
多方法的所有特例。