0

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

(unfinished bar)

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

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

但米杰说:

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 )

我认为“提供”不能挂钩 bar 函数,因为 foo 没有直接调用 bar。但我也发现如果我像这样更改第二行:

(def tbl {:ev1 #(bar)})

然后测试成功了。

第一个版本有什么方法可以成功吗?

谢谢。

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

4

1 回答 1

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

于 2013-11-25T12:18:59.043 回答