2011-10-22 21 views
8

我读Clojure的约TDD行动第8章,并与存根宏观实验。它使用动态绑定机制来存根函数。唉,在Clojure 1.3中,不可能对非动态变量使用绑定机制,所以在大多数情况下,桩宏不起作用,除非您显式声明指向函数动态的var。然后我想知道如何在Midje完成st and,并试图找到“提供”的来源,但我找不到它。所以这里是:在Midje的事实中,'提供'是如何实现的?

在Midje的事实中,'提供'是如何实现的?有人可以详细解释这一点吗?

+2

您可以通过https://groups.google.com/forum/#!forum/midie重新发布此问题获益。 – user100464

回答

10

的Clojure 1.3提供了一个与-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])))