简体   繁体   中英

Test clojure instance in deftest

I want to check if the right instance is used.
But while the repl gives me true, the actual test returns nil. Idk why


(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

The command lein test gives me:
FAIL in (queue-type-test) (queue_test.clj:6) expected: (instance? clojure.lang.PersistentQueue (clojure.core/deref sut/queue)) actual: nil

I know the test itself is not really useful, but I can't figure out why this behaves like this.

tl;dr: both is and @ are macros. Most obvious fix would be something like:

(deftest queue-type-test
  (let [queue @sut/queue]
    (is (instance? clojure.lang.PersistentQueue queue)))

clojure.test docs don't make it immediately obvious, but is is a pretty tricky macro that looks inside its body. Here's a snippet from the docstring:

user> (is (= 5 (+ 2 2)))

FAIL in  (:1)
expected: (= 5 (+ 2 2))
  actual: (not (= 5 4))
false

Notice actual: (not (= 5 4)) . It's clear that it did not evaluate = so that it can show us the result of (+ 2 2) . Here are all the special cases for assert-expr multimethod.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM