3

バックグラウンド

私はClojureを初めて使用するので、明白なエラーはご容赦ください。redis-clojureライブラリを使用するClojureデータアクセスコードをテストしようとしています。もちろん、統合テストではフルスタックをテストしますが、単体テストをRedisサーバーインスタンスへの接続に依存させたくありません。Midjeを使用して実際のRedisコマンドをモックするのは比較的簡単なようですが、接続マクロの処理はより困難です。

必要な提案

Midjeのドキュメントではできない、または見つけられないのは、redis接続をモックする方法またはマクロを再定義する方法です。core.cljの関連するトップレベルの接続マクロは次のとおりです。

(defmacro with-server
  "Evaluates body in the context of a connection to Redis server
  specified by server-spec.

  server-spec is a map with any of the following keys:
    :host     (\"127.0.0.1\")
    :port     (6379)
    :db       (0)
    :timeout  (5000)
    :password (nil)"
  ([server-spec & body]
     `(with-connection connection# *pool* ~server-spec
        (binding [redis.vars/*channel* (make-direct-channel connection#)]
          ~@body))))

ここでのコンテキストの元のコード

テストコードでマクロを再定義できないようです。結果を生成するには本体を実行する必要があるため、マクロを関数でラップしても、それ以上先に進むことはできません。私が理想的にやりたいのは、接続マクロに渡された本体を実行し、残りのマクロを破棄することです。何か案は?

4

2 に答える 2

2

私はよくテスト用のバインディングラッパーマクロを作成します。これらのマクロは、テストできない関数またはマクロに何か他のものをバインドするだけです。この場合、私はこれらの線に沿って何かを書くでしょう

(defmacro my-fake-with-server []
   ....)

(defmacro with-fake-with-server
      (binding [redis.core/with-server my-fake-with-server]
               (insert test here)))

(deftest my-test (with-fake-with-server (function-that-uses-with-server)))

これにより、テストコードのすべてのモックが保持されます。

于 2012-04-30T23:50:59.157 に答える
1

Midjeメーリングリストで質問することをお勧めします(そしてもちろん、ここに最終的な回答を投稿します)。何をテストしようとしているのかを知らなければ、アドバイスを与えるのは難しいです。おそらく(FreemanとPryceの成長するオブジェクト指向ソフトウェア(Clojureに適用されます-確かに、そのスタイルをサポートすることが私がMidjeを書いた理由です)に続いて)、問題を2つの部分に分けたいと思うでしょう。まず、Redisを分離する一連の関数を作成します。これらの関数が、実際のデータベースで機能する遅くて面倒な直接テストで正しく機能することをテストします。

これらの関数は、接続とラッピングマクロの必要性を隠します。

次に、Midjeの前提条件を使用して、コードが分離関数を正しく呼び出すことをテストできます。

AvdiGrimmのObjectsonRails、データベースの分離について適切に説明している別の本です。

注:Redisについては何も知りませんが、他のいくつかのClojure->データベースライブラリでは、知的に魅力的なラッピングマクロ(with-server)が不要です。代わりに、ステートフルルートをたどり、接続を保持するグローバル変数を持っています。これは、(たとえば)RubyデータベースライブラリのActiveRecord(暗黙的に)やSequel(明示的に)と同じです。純度は低くなりますが、生活(テストを含む)が簡単になるようです。Midjeでは、その接続はメタ定数で表すことができます。

于 2012-05-10T00:49:49.193 に答える