在Clojure和Midje中,如何编写间接调用的先决条件?

在Clojure和Midje中,如何编写间接调用的先决条件?,clojure,tdd,midje,Clojure,Tdd,Midje,在下面的代码中,我想在实现bar函数之前测试foo函数 (unfinished bar) (def tbl {:ev1 bar}) (defn foo [ev] ((tbl ev))) (fact "about an indirect call" (foo :ev1) => nil (provided (bar) => nil)) 但是Midje说: FAIL at (core_test.clj:86) These calls were not made the

在下面的代码中,我想在实现bar函数之前测试foo函数

(unfinished bar)

(def tbl {:ev1 bar})
(defn foo [ev] ((tbl ev)))

(fact "about an indirect call"
  (foo :ev1) => nil
  (provided
    (bar) => nil))
但是Midje说:

FAIL at (core_test.clj:86)
These calls were not made the right number of times:
    (bar) [expected at least once, actually never called]

FAIL "about an indirect call" at (core_test.clj:84)
    Expected: nil
      Actual: java.lang.Error: #'bar has no implementation,
      but it was called like this:
(bar )
我认为'provided'不能钩住bar函数,因为foo没有直接调用bar。但我也发现如果我把第二行改成这样:

(def tbl {:ev1 #(bar)})
然后试验成功了

第一版有没有成功的方法

谢谢


PS:我正在使用Clojure 1.5.1和Midje 1.5.1。

提供的
使用带有redefs的
味道来改变var的根。定义
tbl
时,您已经取消了对var
#'条的引用,提示
tbl
包含未绑定的值,而不是对要执行的逻辑的引用。我想说的是,您不能为已经评估的值提供替换

同样地:

(defn x [] 0)
(def tbl {:x x})
(defn x [] 1)
((:x tbl)) ;; => 0
您需要将var本身存储在
tbl
中:

(defn x [] 0)
(def tbl {:x #'x})
(defn x [] 1)
((:x tbl)) ;; => 1
你的测试也一样。一旦您使用
(def tbl{:ev1#'bar})
,它们就会通过