0

我正在为我的应用程序中的一个相当大的函数编写一个 clojure.test 单元测试。该函数多次调用数据库和外部 REST 服务并进行一些计算。例如,我要测试的功能是这样的

(defn myfunc [id]
   (let[
        w (some-security-call id)
        x (some-db-call id)
        y  (some-REST-call x)
        z ( some-audit-call y)

       ]
       (-> y :somekey )))

为了测试这种方法,我想删除或重新定义“ some-audit-call ”和“ some-security-call ”。Clojure 的with-redefs-fn一次只重新定义一种方法。

有没有一种标准的方法来模拟一个被单元测试的函数中使用的多个函数?

4

1 回答 1

1

with-redefs可以根据需要处理尽可能多的功能。这是我的实际生产测试中的一个经过编辑的示例。

(with-redefs [namespace/redacted            (constantly [])
              namespace/redacted                 (fn [& args] (async/go namespace/redacted))
              namespace/redacted        (constantly [2 4])
              namespace/redacted                (fn [& args] (namespace/redacted sample-redacted-ads))
              namespace/redacted                (fn [_ _ redacted & _]
                                                  (async/go (cond-> namespace/redacted
                                                              namespace/redacted (dissoc redacted))))
              namespace/redacted                   (fn [& args] (async/go nil))
              namespace/redacted       fake-redacted
              namespace/redacted       fake-redacted
              namespace/redacted      namespace/redacted
              namespace/redacted       (go (constantly []))
              namespace/redacted               (fn [_] [])
              namespace/redacted      namespace/redacted
              namespace/redacted      namespace/redacted
              namespace/redacted                        (fn [_] {:redacted "redacted"})]
  (is (= "redacted"
         (get-in (<!!
                  )
                 ))
      "We should return the redacted if we don't pass it in")
  ... many more tests here ...

)

如果您需要重新定义要重新定义的另一个函数使用的函数,则必须嵌套对 with-redef 的调用。这有时会导致人们认为 with-redefs 只适用于一个函数。

with-redefs-fn除非您知道有特定原因,否则您可能不想使用。

于 2016-09-02T21:05:12.253 回答