当我使用外部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
的情况下通过这些内容。
答案 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
包装事实。