【问题标题】:Clojure - How To Properly Mount State In Unit TestsClojure - 如何在单元测试中正确挂载状态
【发布时间】:2018-09-13 14:33:16
【问题描述】:

我正在尝试使用 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 我会得到相同的状态错误。

我希望能够将我的测试文件中定义的连接传递到我的其他数据库文件中。有没有办法我可以做到这一点并让它覆盖它在那里的设置方式?

【问题讨论】:

  • 您好像忘记通过(mount/start #'db)启动资源了。

标签: mongodb testing clojure luminus monger


【解决方案1】:

您应该使用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

【讨论】:

  • 不确定我做错了什么,添加它会给我一个空指针异常,并且错误无法启动 [#'app.db.core/db*] 由于 at mount.core $up$fn__273.invoke(core.cljc:92)
  • @newBieDev 你有更多的堆栈跟踪或示例代码吗?
  • 嗨,Ray,您最终解决了这个问题吗?谢谢!
  • 嘿@JeelShah,评论者从未回复过新错误。我在我的工作项目中使用了这种方法
  • 谢谢雷!我很欣赏回复:D 我没想到它,因为帖子很旧。 :P
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多