如何在Clojure中测试高阶函数?

Amo*_*kar 5 testing unit-testing functional-programming clojure higher-order-functions

如何在Clojure中测试高阶函数?

我总是可以测试一个接受值的函数,然后检查返回值与预期的值.

如何使用更高阶函数执行此操作?

或者我们通常会避免这样做?

Mat*_*ick 5

这是一个很好的问题。更准确地说这个问题:

高阶函数“采用或产生其他函数作为参数或结果”。所以有两种情况:

  1. 取函数的函数。示例:mapreducefilter。这些并不难测试;只需像普通函数一样提供所有参数即可。

  2. 返回函数的函数。例子:(fn [x] (fn [y] (+ x y))), (partial filter #(> % 1))。这些很难测试,因为我们不能直接比较函数的相等性(寻找内涵和外延相等性进行彻底讨论)。

    很明显,不进行测试并不是一个很好的策略。那么为什么不采用 Haskell 的观点,即部分应用函数本质上与返回函数的函数相同——换句话说,将足够的参数传递给返回的函数以获得可以测试是否相等的结果。

    只是要小心注意测试中的耦合——确保您的测试用例实际上是在测试高阶函数的规范,而不仅仅是它返回的函数。