在Clojure和Midje中,如何编写间接调用的先决条件?
在下面的代码中,我想在实现bar函数之前测试foo函数在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
(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})
,它们就会通过