3

当我使用外部 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))

我不应该对letmidje 使用语句吗?我无法理解如何在不删除let.

4

1 回答 1

4

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

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

要改变这一点,你可以做两件事之一。要么你让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包装事实似乎在第一个事实被触及之前被执行。

于 2013-11-27T09:01:41.587 回答