在deftest中测试clojure实例

时间:2018-02-27 15:54:04

标签: unit-testing clojure

我想检查是否使用了正确的实例 但是当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

我知道测试本身并不是很有用,但我无法弄清楚为什么会出现这种情况。

1 个答案:

答案 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)的结果。 Hereassert-expr多方法的所有特例。