Reputation: 153
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.
Upvotes: 1
Views: 369
Reputation: 699
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.
Upvotes: 1