我是Clojure的新手,经过搜索之后,我将问题转至SO社区。
我正在测试一个协议实现(deftype
),该协议实现引用了另一个协议,因此构造函数如下所示:
(deftype FooImpl [^Protocol2 protocol-2]
(function bar [_] ... (.bar2 protocol-2))
)
...
是满足调用.bar2
函数的某些条件。我无法执行的操作是检测(
conjure.core/instrumenting
)调用.bar2
以验证传递的参数(verify-called-once-with-args
)。所以问题是这样的:
(instrumenting [ns/function ;;In normal case with `defn`
????] ;; what to write for .bar2
....)
谢谢!
最佳答案
对于正常使用或测试/模拟,您可以使用reify
来实现该协议:
(instrumenting [ns/function]
(ns/function (reify Protocol2
(bar2 [_]
; Your mock return value goes here
42))))
您还可以使用
atom
进行自己的检查:(instrumenting [ns/function]
(let [my-calls (atom 0)]
(ns/function (reify Protocol2
(bar2 [_]
; Increment the number of calls
(swap! my-calls inc)
; Your mock return value goes here
42)))
(is (= @my-calls 1))))
以上假设您正在使用clojure.test,但是任何clojure单元测试库都可以验证您的atom的值。