编写测试时无法删除重复项
unable to remove duplication when composing tests
我无法删除 clojure.test
测试中的重复项。
假设我对同一个抽象有多个实现:
(defn foo1 [] ,,,)
(defn foo2 [] ,,,)
(defn foo3 [] ,,,)
而且我还有一个所有实现都应该通过的测试:
(defn test-impl [foo]
(is (= ,,, (foo))))
我现在可以创建一个 clojure.test
测试,一步检查所有实现:
(deftest test-all-impls
(test-impl foo1)
(test-impl foo2)
(test-impl foo3))
一切都很好; 运行我得到 REPL 中的测试:
(运行-测试)
测试用户
运行 1 个测试包含 <b>3 个断言</b>。
0 失败,0 错误。
=> {:test 1, <b>:pass 3</b>, :fail 0, :error 0, :type :summary}
我现在想修改 test-all-impls
以消除必须为每个实现显式调用 test-impl
的重复。我想到修改 test-all-impls
如下:
(deftest test-all-impls
(for [foo [foo1 foo2 foo3]] (test-impl foo))
嗯,现在并非一切都好;在 REPL 中我得到:
(运行-测试)
测试用户
运行 1 个测试包含 <b>0 个断言</b>。
0 失败,0 错误。
=> {:test 1, <b>:pass 0</b>, :fail 0, :error 0, :type :summary}
我错过了什么?
要绕过 for 的惰性,请改用 doseq:
(deftest test-all-impls
(doseq [foo [foo1 foo2 foo3]] (test-impl foo))
另一个答案是将结果转换为向量,这将强制 for
循环到 运行:
(deftest test-all-impls
(vec (for [foo [foo1 foo2 foo3]] (test-impl foo))))
我无法删除 clojure.test
测试中的重复项。
假设我对同一个抽象有多个实现:
(defn foo1 [] ,,,)
(defn foo2 [] ,,,)
(defn foo3 [] ,,,)
而且我还有一个所有实现都应该通过的测试:
(defn test-impl [foo]
(is (= ,,, (foo))))
我现在可以创建一个 clojure.test
测试,一步检查所有实现:
(deftest test-all-impls
(test-impl foo1)
(test-impl foo2)
(test-impl foo3))
一切都很好; 运行我得到 REPL 中的测试:
(运行-测试)
测试用户
运行 1 个测试包含 <b>3 个断言</b>。
0 失败,0 错误。
=> {:test 1, <b>:pass 3</b>, :fail 0, :error 0, :type :summary}
我现在想修改 test-all-impls
以消除必须为每个实现显式调用 test-impl
的重复。我想到修改 test-all-impls
如下:
(deftest test-all-impls
(for [foo [foo1 foo2 foo3]] (test-impl foo))
嗯,现在并非一切都好;在 REPL 中我得到:
(运行-测试)
测试用户
运行 1 个测试包含 <b>0 个断言</b>。
0 失败,0 错误。
=> {:test 1, <b>:pass 0</b>, :fail 0, :error 0, :type :summary}
我错过了什么?
要绕过 for 的惰性,请改用 doseq:
(deftest test-all-impls
(doseq [foo [foo1 foo2 foo3]] (test-impl foo))
另一个答案是将结果转换为向量,这将强制 for
循环到 运行:
(deftest test-all-impls
(vec (for [foo [foo1 foo2 foo3]] (test-impl foo))))