在下面的代码中,我想在实现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 )
我认为'提供'无法挂钩条形函数,因为foo没有直接调用条形图。但我也发现如果我改变了第二行:
(def tbl {:ev1 #(bar)})
然后测试成功了。
第一个版本有没有办法成功?
感谢。
PS:我正在使用Clojure 1.5.1和Midje 1.5.1。
答案 0 :(得分:0)
provided
使用with-redefs
的味道来改变 var 的根。定义tbl
时,您已取消引用var #'bar
,提示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})
后,他们会通过。