1

単体テストの実行時に (def db ...) がデータベースの初期化を試行しないように、データベースを初期化するにはどうすればよいですか (その場合はデータベースではないため)。

関数で sql と dml をモックします ( with-redefs ) が、これまでに見つけたすべての例では、データベースを名前空間で直接定義するだけです (たとえば、関数にラップされていません)。

4

1 に答える 1

2

データベースを Var に配置しないことを強くお勧めします。これは非常に魅力的ですが、非常に有害な環境結合の形です。

推奨される方法は、データベースにデータベースへのアクセスが必要な関数の引数としてデータベースを渡すことです。

;; BAD
(def db ...)

(defn find-user [user-id]
  (run-query find-user-query db user-id))

;; GOOD
(defn find-user [db user-id]
  (run-query find-user-query db user-id))

思ったほど面倒ではなく、メリットは大きいです (テスト、repl 駆動型開発など)。


ノート:

Clojure コミュニティの初期には、常にパラメーターを追加しなくても済むように、動的な Var が使用されていました。

(def ^:dynamic db nil)

(binding [db ...]
  (find-user user-id))

次に、それをやめることを学びました:) ロジックをその環境で完成させることは、プログラムの悪い基盤に過ぎません。

于 2015-12-12T17:08:36.467 に答える