使用deftest测试集合项

fus*_*ion 1 clojure

我正在尝试使用clojure.test和deftest宏编写一些测试.

(deftest a-test
  (for [item collection]
    (is (= (f item) :a-value))))
Run Code Online (Sandbox Code Playgroud)

但我意识到这不是执行此测试的正确方法.我搜索了文档,发现'是'宏,但我不确定如何在这些情况下使用它.

编写此类测试的首选方法是什么?

Ale*_*lex 6

你的测试不起作用的原因是for简单地建立一个懒惰的序列; 它不像其他编程语言那样是命令式循环.有几种方法可以重写此测试.

使用该every?函数测试集合中的所有项是否满足谓词.这可能是代码量最少的,但缺点是如果测试失败,您将无法知道哪个特定项目失败.

(deftest a-test
  (is (every? #(= (f %) :a-value) collection)))
Run Code Online (Sandbox Code Playgroud)

使用重写测试are.如果要测试的集合中的项目是特定于此测试的硬编码输入列表,则这是一个不错的选择,并且稍微更惯用.

(deftest a-test
  (are [item] (= (f item) :a-value)
    :a
    :b
    :c
    ;; other collection items here...
  ))
Run Code Online (Sandbox Code Playgroud)

最后,你可以换掉for一个doseq.这对于编写测试来说稍微不那么惯用,但其优点在于它可以与以编程方式生成的一组测试输入一起使用.

(deftest a-test
  (doseq [item collection]
    (is (= (f item) :a-value))))
Run Code Online (Sandbox Code Playgroud)