Clojure - 如何在实现中检测另一个协议

时间:2018-05-28 18:59:07

标签: testing clojure

我是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
   ....)

谢谢!

1 个答案:

答案 0 :(得分:1)

对于正常使用或测试/模拟,您可以使用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单元测试库都可以验证您原子的值。