我正在尝试使用clojure.test和deftest宏编写一些测试.
(deftest a-test
(for [item collection]
(is (= (f item) :a-value))))
Run Code Online (Sandbox Code Playgroud)
但我意识到这不是执行此测试的正确方法.我搜索了文档,发现'是'宏,但我不确定如何在这些情况下使用它.
编写此类测试的首选方法是什么?
你的测试不起作用的原因是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)