2011-07-22 16 views
12

Recientemente comencé a trabajar en una aplicación Clojure con muchas bases de datos y estoy intentando realizar algunas pruebas unitarias. Idealmente, me gustaría evitar llegar a una base de datos real burlándome de cosas.Clojure database unit testing/mocking

He aquí un ejemplo de una prueba sencilla:

prueba core.clj

(deftest core-test 
    (is (> (count (fn-under-test "foo")) 0))) 

core.clj

(defn fn-under-test [slug] 
    (db/query "select * from %1" slug)) 

db.clj

(defn query [q & args] 
    (sql/with-connection db 
    (sql/with-query-results res 
     [(clause q args)] 
     (doall res)))) 

Mi pregunta : hay una manera, desde dentro test-core.clj, para vincular una función personalizada a 'db/query' de modo que core.clj lo use, en oposición a la definición dentro de db.clj?

Gracias!

Respuesta

10

Puede usar binding para tratar de anular la búsqueda/consulta, pero primero deberá definir el espacio de nombre y var. La forma más fácil es importar el db.clj en el mismo espacio de nombres y luego usar enlaces.

(ns test-core 
    (:use clojure.test) 
    (:require db)) 

(deftest core-test 
    (binding [db/query (fn [query & args] (comment return some value here))] 
    (is (> (count (fn-under-test "foo")) 0)))) 
+0

Gracias! Intenté usar el enlace (y con el enlace) el día de hoy, pero no tuve éxito - Seguí recibiendo _Excepción en el hilo "principal" java.lang.Exception: no se pudo resolver var: db/query en este contexto_. – eff

+0

Puedes intentar requerir db.clj en tu prueba, luego usar enlaces. – Jeff

+0

¡Perfecto! : require db resolvió todo. ¡Gracias una tonelada! – eff