使用let子句中提供的midje不是存根方法

时间:2013-11-27 05:28:21

标签: clojure midje

当我使用外部let子句进行测试来构造一些定义和调用时,存根不会按照我期望的方式工作。例如:

此测试失败

(fact "blah"
  (let [x (meth1 123)]
    x => 246
    (provided
      (meth2 123) => 246)))

使用此代码

(defn meth2 [x]
  (prn "meth2" x)
  (* 3 x))

(defn meth1 [x]
  (let [y (meth2 x)]
    y))

我不应该在midje中使用let语句吗?我无法理解如何在不删除let的情况下通过这些内容。

1 个答案:

答案 0 :(得分:3)

首先,如果meth2被正确存根,那么您的测试甚至会失败,因为(fn [] x)会返回一个函数,因此事实(fn [] x) => 246永远不会成功。

其次,我认为provided仅在执行事实的左/右侧时用于存根函数调用。在您的情况下,(fn [] x)(并且此时已经评估x),以及246(这是常量)。 meth1永远不会在事实的背景下被调用,只是事先。

要改变这一点,你可以做两件事之一。你要么做出事实左边的let部分:

...
(let [x (meth1 123)] x) => 246
...

或者让x成为在测试事实时评估的函数:

...
(let [x #(meth1 123)] (x)) => 246
...

我认为没有办法真正看到 provided在行动中,就像这样:

(let [x (meth1 123)]
   x => 369
  (let [...]
    x => 246
    (provided 
      (meth2 123) => 246))))

在触及第一个事实之前,似乎执行了let包装事实。