unit-testing - 断言调用模拟发生在 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)
有没有一种简洁的方式来断言通话已经发生?
解决方案
您需要一些可以记住函数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?)
即使从未调用过该函数,它也总是通过。
推荐阅读
- cloudify - 一种将数据从外部文件传递到实例的方法
- python-3.x - 如何使用networkx可视化多重图?
- c++ - 是什么导致 hash_map 错误,我该如何解决?
- postman - 邮递员发送请求完全在先决条件脚本中构建
- algorithm - 在恒定时间和线性空间中找到两个字符串的 LCP
- python - 对包含 Sympy 符号的 Dataframe 列进行排序
- python-3.x - Python 包装器 coinbase api 错误
- android - 如何在 Android Studio 中使用 putFragment 和 getFragment
- assembly - MIPS 汇编错误的数字
- javascript - Dialogflow Fulfillment webhook 调用失败