在deftest中测试clojure实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在deftest中测试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

我知道测试本身并不是很有用,但我无法弄清楚为什么它会像这样。

答案

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多方法的所有特例。

以上是关于在deftest中测试clojure实例的主要内容,如果未能解决你的问题,请参考以下文章

Clojure经典实例 PDF下载

UnitTest基础测试实例

Clojure 测试中的数据库模拟

测试列表是不是包含 Clojure 中的特定值

在 clojure.jdbc 和 postgres 中使用保存点进行测试的嵌套事务

如何在clojure期望中实现fixture?