Amo*_*kar 5 testing unit-testing functional-programming clojure higher-order-functions
如何在Clojure中测试高阶函数?
我总是可以测试一个接受值的函数,然后检查返回值与预期的值.
如何使用更高阶函数执行此操作?
或者我们通常会避免这样做?
这是一个很好的问题。更准确地说这个问题:
高阶函数“采用或产生其他函数作为参数或结果”。所以有两种情况:
取函数的函数。示例:map
、reduce
、filter
。这些并不难测试;只需像普通函数一样提供所有参数即可。
返回函数的函数。例子:(fn [x] (fn [y] (+ x y)))
, (partial filter #(> % 1))
。这些很难测试,因为我们不能直接比较函数的相等性(寻找内涵和外延相等性进行彻底讨论)。
很明显,不进行测试并不是一个很好的策略。那么为什么不采用 Haskell 的观点,即部分应用函数本质上与返回函数的函数相同——换句话说,将足够的参数传递给返回的函数以获得可以测试是否相等的结果。
只是要小心注意测试中的耦合——确保您的测试用例实际上是在测试高阶函数的规范,而不仅仅是它返回的函数。