Conman ヘルパー ライブラリを使用して、HugSQL テンプレートから生成されたデータベース アクセス関数をモックするのに問題があります。これらの関数は、実行時に次のように定義されます。
(conman/bind-connection *db* file)
私の場合、このサービス関数の単体テストを行っています。
(defn create-user [user]
(do (-> user
(password-service/assoc-salt-and-hash)
(dissoc :password)
(assoc :is-admin false)
(db/create-user!))
(select-keys user [:firstname :lastname :email])))
db/create-user!
関数は Conman によって生成されます。ただし、この Midje テストでその関数をモックアウトしようとすると、次のエラー メッセージが表示されます。
(fact "calls db function with created password fields and without plaintext password"
(create-user user) => (select-keys user [:firstname :lastname :email])
(provided
(password/assoc-salt-and-hash (as-checker (contains user))) => (merge user salt-and-hash)
(db/create-user! (as-checker (contains user-to-db))) => user-to-db))
FAIL at (user.clj:24)
You never said #'create-user! would be called with these arguments:
[{:firstname "asd", :lastname "lol", :email "email@email.com", :password-salt #object["[B" 0x5074bde0 "[B@5074bde0"], :password-hash #object["[B" 0x60f8a634 "[B@60f8a634"], :is-admin false}]
FAIL at (user.clj:25)
These calls were not made the right number of times:
(db/create-user! (as-checker (contains user-to-db))) [expected at least once, actually never called]
nil
FAILURE: 2 checks failed. (But 1 succeeded.)
[Completed at 20:27:05]
動的に作成されモック化された関数をサービスとテストの両方からまったく同じように参照していますが、midje はそれを同じ関数として認識しません。また、var( #'musician.user.db/create-user!
) を介して関数を参照し、サービスとテストの両方からのフル パスを使用しようとしましmusician.user.db/create-user!
たが、どちらも機能しませんでした。サービス コードは、REST API と REPL からテストすると機能しますが、このテストをセットアップできません。
問題は、実行前にわからないため、midje が関数をモックできないことのようです。これは関数を正しく参照するだけの問題ですか、それとも Midje でこれらの関数をモックアウトすることはできませんか?