单元测试Clojure中的本地函数(letfn)?

时间:2014-12-17 21:23:57

标签: unit-testing clojure scope tdd

我花了几年的时间做“计划”,现在正在学习Clojure。 Scheme中的“最佳实践”之一是在父函数中定义辅助函数,从而限制它们从“外部”的可见性。当然,当时TDD没有完成(或者已知!)所以测试这些功能不是问题。

我仍然想以这种方式构建Clojure函数;即,使用letfn绑定主函数中的辅助函数。当然,测试这种“本地”功能是有问题的。我意识到我可以定义“私有”函数,但这会限制命名空间的可见性,这有助于,但不是那么精细。如果你在另一个函数中遇到letfn,很明显该函数不能用于一般用途。

所以,我的问题是,可以测试这样的本地功能,如果是,如何?如果没有,那么是否有一些约定来帮助代码读取,这样很明显函数只有一个调用者?

TIA,  比尔

1 个答案:

答案 0 :(得分:1)

通常的方法是将函数放在命名空间中。

一种选择是使用元数据:

user=> (defn ^{::square #(* % %)} cube [x]
  #_=>   (* x ((::square (meta #'cube)) x)))
#'user/cube
user=> (meta #'cube)
{…, :user/square #<user$fn__780 user$fn__780@2e62c3f9>}
user=> (cube 3)
27

当然可以编写一个宏来使它更漂亮。