在Clojure中测试带有副作用的单元

4
我有一个从AMPQ消息总线中提取消息的函数:
(defn get-message [queue client]
    (let [msg (mq/get-message client queue)]
    (if msg
        (logit msg))))

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

在Clojure中,有没有一种惯用的方法来对副作用进行单元测试?我的第一反应是使用mocks/stubs,但如果有更好的方法就最好了。

1个回答

9

使用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 的某个东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接