在Clojure和Midje,我如何为间接呼叫编写先决条件?

时间:2013-11-23 03:08:34

标签: 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 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。

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})后,他们会通过。