简体   繁体   English

在deftest中测试Clojure实例

[英]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. 但是,虽然repl给了我true,但实际测试返回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: lein test命令给我:
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. tl; dr: is@都是宏。 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. clojure.test文档不会立即使它变得显而易见,但是is是一个看起来非常棘手的宏,它看起来在其内部。 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)) . 注意actual: (not (= 5 4)) It's clear that it did not evaluate = so that it can show us the result of (+ 2 2) . 显然,它没有评估=因此它可以向我们显示(+ 2 2) Here are all the special cases for assert-expr multimethod. assert-expr多方法的所有特殊情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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