我正在尝试使用 Monger 数据库库在 luminus 应用程序中测试一些数据库操作。
理想情况下,我希望以下内容起作用。我已经删除了一些不相关的代码。
测试文件:
(ns app.test.handler
(:require [clojure.test :refer :all]
[app.db.core :as db]))
(testing "create user"
(db/create-user "test" "test" "test")
(is (true? true))))
数据库文件
(defstate db*
:start (-> env :database-url mg/connect-via-uri)
:stop (-> db* :conn mg/disconnect))
(defstate db
:start (:db db*))
(defn create-user
"Creates a new user with a token"
[username email password]
(let [user {:username username
:email email
:password (hashers/derive password)
}]
(mc/insert db "user" user)))
这不起作用,并给我以下错误:
java.lang.ClassCastException: mount.core.DerefableState cannot be cast to com.mongodb.DB
据我所知,这没有正确挂载数据库,因此它无法调用数据库操作。我尝试将此挂载代码移动到测试中,但仍然收到相同的错误。
我确实让这个工作:
测试文件
(def db (mg/connect-via-uri "mongodb://127.0.0.1:27017/worldbuilder"))
(testing "create user"
(let [user {:username "test"
:email "test"
:password "test"
:token "test"
}]
(mc/insert (:db db) "user" user)
(is (true? true))))
但这需要我在测试中重写操作,从而破坏目的。如果我离开上面的连接,但调用 db/create-user,我会收到相同的状态错误。
我希望能够将测试文件中定义的连接传递到其他数据库文件中。我有没有办法做到这一点并让它覆盖它在那里的设置方式?
您应该使用clojure.test/use-fixtures
在测试中设置有状态位,例如:
(ns app.test.handler) ; rest of ns block omitted for clarity
(defn start-states [f]
(mount.core/start)
(f))
(clojure.test/use-fixtures :once start-states)
这将在运行任何测试之前启动数据库。
有关如何自定义此内容的链接,请参阅:https://clojuredocs.org/clojure.test/use-fixtures
这里还有一些关于clojure.test的更有味道的读物(来自创作者本人(: https://stuartsierra.com/2016/05/19/fixtures-as-caches