【问题标题】:Using midje provided in a let clause doesn't stub methods使用 let 子句中提供的 midje 不会存根方法
【发布时间】:2013-11-27 05:28:20
【问题描述】:

当我使用外部 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,我无法理解如何让这些通过。

【问题讨论】:

    标签: clojure midje


    【解决方案1】:

    首先,如果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 似乎在第一个事实被触及之前执行。

    【讨论】:

    • 这就是我最终的结果。除了使用上下文进行设置和清理,而不是 let 语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2021-02-27
    • 2011-12-13
    • 2020-08-19
    • 2022-11-02
    • 2015-11-02
    相关资源
    最近更新 更多