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

aci*_*lio 3 clojure midje

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

本次测试失败

(fact "blah"
  (let [x (meth1 123)]
    x => 246
    (provided
      (meth2 123) => 246)))
Run Code Online (Sandbox Code Playgroud)

有了这个代码

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

(defn meth1 [x]
  (let [y (meth2 x)]
    y))
Run Code Online (Sandbox Code Playgroud)

我不应该使用letmidje 语句吗?我不明白如何在不删除let.

xsc*_*xsc 5

首先,如果由于返回函数而meth2正确存根,您的测试甚至会失败,因此事实永远不会成立。(fn [] x)(fn [] x) => 246

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

要改变这一点,您可以执行以下两件事之一。要么你制作let事实左侧的部分:

...
(let [x (meth1 123)] x) => 246
...
Run Code Online (Sandbox Code Playgroud)

或者您创建x一个在测试事实时进行评估的函数:

...
(let [x #(meth1 123)] (x)) => 246
...
Run Code Online (Sandbox Code Playgroud)

我认为没有办法真正看到 provided实际情况,即像这样:

(let [x (meth1 123)]
   x => 369
  (let [...]
    x => 246
    (provided 
      (meth2 123) => 246))))
Run Code Online (Sandbox Code Playgroud)

包装let事实似乎是在第一个事实被触及之前执行的。