2011-07-22 4 views
12

最近、データベースの重いClojureアプリケーションの作業を開始し、ユニットテストを実施しようとしています。理想的には、私は実際に物事を嘲笑して実際のデータベースを打つことを避けたいと思います。Clojureデータベースユニットのテスト/黙示

ここでは簡単なテストの例です:

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

私の質問db.clj

テスト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内の定義とは対照的に、core.cljが使用するように、カスタム関数を 'db/query'にバインドするにはtest-core.cljを使用しますか?

ありがとうございます!

答えて

10

bindingを使用してdb/queryをオーバーライドできますが、名前空間とvarを最初に定義する必要があります。一番簡単な方法は、db.cljを同じ名前空間にインポートし、バインディングを使用することです。

(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

ありがとうございます!私は今日のバインディング(とバインディング)を使用しようとしましたが、それをやり遂げることができませんでした - スレッド "メイン" java.lang.Exceptionで_Exceptionを取得し続けています:var:db/query in thisを解決できませんコンテキスト_。 – eff

+0

テストでdb.cljを要求してから、バインディングを使用してみることができます。 – Jeff

+0

パーフェクト! :すべてが解決されたdbが必要です。ありがとう、トン! – eff

関連する問題