2011-10-22 12 views
8

Stavo leggendo Clojure in Action capitolo 8 su TDD e ho sperimentato con la macro di stub. Usa il meccanismo di legame dinamico per bloccare le funzioni. Purtroppo, in Clojure 1.3 non è possibile utilizzare il meccanismo di binding per le vars non dinamiche, quindi la macro di stub non funziona nella maggior parte dei casi, a meno che non si dichiari esplicitamente la var che punta a una funzione dinamica. Poi mi sono chiesto come è fatto lo stub in Midje e ho cercato di trovare la fonte per "fornito", ma non sono riuscito a trovarlo. Quindi ecco qui:Come viene implementato "fornito" in un fatto a Midje?

Come viene implementato "fornito" in un fatto a Midje? Qualcuno può spiegarlo in dettaglio?

+2

È possibile trarre vantaggio dal ripubblicare questa domanda all'indirizzo https://groups.google.com/forum/#!forum/midje. – user100464

risposta

10

Clojure 1.3 fornisce una macro con-redefs che funziona anche con vars che non sono stati dichiarati dinamica:

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

Per compatibilità all'indietro, Midje utilizza una propria versione, il cui coraggio simile a questa:

(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]))) 
Problemi correlati