単体テストの実行時に (def db ...) がデータベースの初期化を試行しないように、データベースを初期化するにはどうすればよいですか (その場合はデータベースではないため)。
関数で sql と dml をモックします ( with-redefs ) が、これまでに見つけたすべての例では、データベースを名前空間で直接定義するだけです (たとえば、関数にラップされていません)。
単体テストの実行時に (def db ...) がデータベースの初期化を試行しないように、データベースを初期化するにはどうすればよいですか (その場合はデータベースではないため)。
関数で sql と dml をモックします ( with-redefs ) が、これまでに見つけたすべての例では、データベースを名前空間で直接定義するだけです (たとえば、関数にラップされていません)。
データベースを 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))
次に、それをやめることを学びました:) ロジックをその環境で完成させることは、プログラムの悪い基盤に過ぎません。