Clojure中with-test的共享定义

时间:2011-08-14 05:00:44

标签: unit-testing clojure

在使用with-test时,我很难看到如何定义在多个测试中使用的值。我想做的是:

(with-test

  (defn myfunction [arg...]
    (code to test))

  (let [a (something-complex ...)
        b (something-else ...)]
    (is (= '(...) (myfunction a ....)))
    (is (= '(...) (myfunction a b ..)))
    (is (= '(...) (myfunction b ....))))

我定义ab一次,但在多次测试中使用它们(多个断言;这可能是一次测试 - 即使我不清楚)。

请 - 我该怎么做?

1 个答案:

答案 0 :(得分:3)

您的假设是正确的,给with-test定义后的代码体将像任何正常的Clojure代码一样进行评估,因此您可以使用类似let的构造。

一个好的建议是使用macroexpand来查看像with-test这样的宏生成的代码。你对此有多少信任是很难确定的。我会说你应该用你的常识来弄清楚你正在使用的宏的实际目的是什么。宏是强大的工具,通常使用宏并依赖于实现细节之间的边界比函数更加模糊。在这种情况下,你应该对with-test的行为充满信心,通过查看参数列表,最后一个参数,即body,暗示它以与函数体相同的方式接受任意数量的形式,letdo可以使用。