我是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的值。

10-08 16:54