首页 > 解决方案 > 断言调用模拟发生在 Clojure 测试中

问题描述

在 Clojure 的单元测试中,我试图断言发生了一个调用。以下代码检查调用参数,但不检查调用是否实际发生。

(require '[clojure.test :refer :all])
(defn g [x] (* x x))
(defn f [x] (inc (g x)))
(deftest f-g-test
  (testing "f(x) calls g(x)"
    (with-redefs [g (fn [x] (is (= x 3)) 9)]
      (is (= (f 3) 10)))))
(run-tests)

有没有一种简洁的方式来断言通话已经发生?

标签: unit-testingclojuremocking

解决方案


您需要一些可以记住函数g是否被调用的状态。它可以是一个原子,也可以是一个(可能是动态的)var:

(deftest f-g-test
  (testing "f(x) calls g(x)"
    (let [called? (atom false)]
      (with-redefs [g (fn [x]
                        (reset! called? true)
                        (is (= x 3)) 9)]
        (is (= (f 3) 10))
        (is (= true @called?))))))

比较true防止忘记@符号的错误,比较:

(is called?)  

即使从未调用过该函数,它也总是通过。


推荐阅读