Clojure中的单元测试副作用

时间:2014-02-26 16:29:03

标签: unit-testing clojure side-effects

我有一个从AMPQ消息总线中提取消息的函数:

(defn get-message [queue client]
    (let [msg (mq/get-message client queue)]
    (if msg
        (logit msg))))

mq / get-message和logit都是副作用,一个取决于网络访问,另一个取决于本地计算机上的磁盘IO。

在Clojure中是否有一种惯用的单元测试副作用方法?我的第一个想法是模拟/存根,但如果有更好的东西。

1 个答案:

答案 0 :(得分:8)

使用core.test我通常会使用with-redefs

模仿副作用函数
(deftest ampq-messaing
  "Test messaging"
  (let [logit-msg (atom nil)]
    (with-redefs [mq/get-message (fn [] "message")
                  logit (fn [msg] 
                           (reset! logit-msg msg))]
      (let [response (your-test-trigger)]
        (is (= "message" @logit-msg))))))

在这种情况下,我正在测试mq中返回的消息是logit中使用的消息,我假设your-test-trigger是触发get-message调用的消息1}}。