【问题标题】:How can I write unit tests for private clojure functions?如何为私有 clojure 函数编写单元测试?
【发布时间】:2016-09-25 01:43:18
【问题描述】:

我想为使用 defn- 定义为私有的函数编写单元测试。我该怎么做?

【问题讨论】:

    标签: unit-testing clojure private


    【解决方案1】:

    原来你可以使用reader宏#'或者var来引用要测试的私有函数。如果私有函数在命名空间 a.b 中并且名称为 c:

    (ns a.b-test
      (:use
        [clojure test]))
    
    (deftest a-private-function-test
      (testing "a private function"
        (let [fun #'a.b/c]
          (is (not (fun nil))))))
    

    【讨论】:

    • 使用语法#'a.b/d(var a.b/d) 的快捷方式,返回指向“函数”a.b/d 的“var”。当 Clojure 看到 var 时,它会在计算之前自动替换该函数。几年来,我发现这种(主要是未记录的)行为非常令人困惑。
    • @AlanThompson 呵呵,看起来clojure.lang.Var 实现了IFn。我不知道。我想它有一定的意义......
    • 有点悲伤,private 像这样在 clojure 中被修补
    • 您可以使用它在 nREPL 中执行私有函数,这对于了解您不熟悉的代码库非常有用!
    【解决方案2】:

    在此处关注此主题的对话:https://groups.google.com/forum/#!msg/clojure/mJqplAdt3TY/GjcWuXQzPKcJ

    我建议您不要使用 defn- 编写私有函数,而是将您的私有函数放在单独的命名空间中(因此是 clj 文件,例如 utils.clj)。

    那么你:

    1. 在需要私有函数的地方需要这个文件,例如在您的 API 定义中使用 (:require [yourappname.utils :refer :all]) 之类的内容
    2. 需要在您的测试命名空间中使用此文件来测试功能。

    然后,您的 API 的任何用户都不会看到或访问这些帮助函数,除非他们当然需要 utils 文件,这大概意味着他们知道自己在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2017-02-15
      • 2016-06-29
      相关资源
      最近更新 更多