2011-10-22 20 views
8

Estaba leyendo Clojure en Action chapter 8 sobre TDD y experimenté con la macro de stubbing. Utiliza el mecanismo de enlace dinámico para funciones de stub. Por desgracia, en Clojure 1.3 no es posible usar el mecanismo de enlace para vars no dinámicos, por lo que la macro de stubbing no funciona en la mayoría de los casos, a menos que declare explícitamente la var que apunta a una función dinámica. Luego me pregunté cómo se hizo el corte en Midje y traté de encontrar la fuente de 'proporcionado', pero no pude encontrarlo. Así que aquí va:¿Cómo se implementa 'proporcionado' en un hecho en Midje?

¿Cómo se implementa 'provided' de hecho en Midje? ¿Alguien puede explicar esto en detalle?

+2

Puede beneficiarse al volver a publicar esta pregunta en https://groups.google.com/forum/#!forum/midje. – user100464

Respuesta

10

Clojure 1.3 proporciona una macro-REDEFS con que funciona incluso con VARs que no han sido declarados dinámica:

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

Para compatibilidad con versiones anteriores, Midje utiliza su propia versión, cuyas entrañas tener este aspecto:

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