如何在Midje实施“提供”?

时间:2011-10-22 17:49:15

标签: clojure tdd stubbing midje

我正在阅读关于TDD的Clojure on Action第8章,并尝试使用stubing宏。它使用动态绑定机制来存根函数。唉,在Clojure 1.3中,不可能将绑定机制用于非动态变量,因此在大多数情况下,存根宏不起作用,除非您明确声明指向函数动态的var。然后我想知道在Midje如何进行存根并试图找到“提供”的来源,但我找不到它。所以这就是:

如何在Midje实施“提供”?有人可以详细解释这个吗?

1 个答案:

答案 0 :(得分:10)

Clojure 1.3提供了一个with-redefs宏,即使对于尚未声明为动态的变量也是如此:

user=> (def this-is-not-dynamic)
user=> (with-redefs [this-is-not-dynamic 900] this-is-not-dynamic)
900

为了向后兼容,Midje使用自己的版本,其内容如下:

(defn alter-one-root [[variable new-value]]
   (if (bound? variable) 
     (let [old-value (deref variable)]
       (alter-var-root variable (fn [current-value] new-value))
       [variable old-value])
     (do
       (.bindRoot variable new-value)
       [variable unbound-marker])))