Clojure 测试中的数据库模拟

Posted

技术标签:

【中文标题】Clojure 测试中的数据库模拟【英文标题】:Database mocking in Clojure tests 【发布时间】:2017-04-21 01:55:08 【问题描述】:

如何模拟我的 postgres 数据库进行测试?

我的应用程序非常简单,但我找不到模拟数据库以进行测试的好方法。在Java中我通常使用HSQLDB,但是Clojure有解决方案吗?

这是我的项目文件。

  (defproject account-manager "0.1.0-SNAPSHOT"
            :description "Account Manager"
            :url "http://example.com/FIXME"
            :license :name "Eclipse Public License"
                      :url "http://www.eclipse.org/legal/epl-v10.html"
            :dependencies [[org.clojure/clojure "1.8.0"]
                           [compojure "1.5.2"]
                           [cheshire "5.7.0"]
                           [ring/ring-core "1.5.1"]
                           [ring/ring-json "0.4.0"]
                           [ring/ring-jetty-adapter "1.5.1"]
                           [korma "0.4.3"]
                           [org.clojars.amit/postgresql "8.0.1"]
                           [com.h2database/h2 "1.4.188"]
                           [ragtime "0.7.1"]
                           [environ "1.1.0"]
                           [org.clojure/data.json "0.2.6"]
                           [buddy/buddy-hashers "1.2.0"]
                           [clj-time "0.13.0"]]
            :plugins [[lein-ring "0.11.0"]]

            :ring :handler account-manager.handler/app
                   :nrepl :start? true
                           :port 9998

            :profiles
            :dev :dependencies [[javax.servlet/servlet-api "2.5"]
                                  [ring-mock "0.1.5"]]
                   :env :bank-db "bank_db"
                         :bank-db-user "bank_db"
                         :bank-db-pass "-"
             :test :env :bank-db "bank_db"
                          :bank-db-user "bank_db"
                          :bank-db-pass "-")

这就是我配置数据库的方式。以后我会使用配置文件。

(ns bank-account-manager.db
  (:use korma.db)
  (:require [environ.core :refer [env]]))

(defdb db (postgres :db (get env :bank-db "bank_db")
                     :user (get env :bank-db-user "bank_db")
                     :password (get env :bank-db-pass "-")
                     :host (get env :bank-db-host "localhost")
                     :port (get env :bank-db-port 5432)))

有什么好的mock方法?

【问题讨论】:

你试过用HSQLDB吗? 我没有找到任何使用 HSQLDB 的人的参考资料。你有例子吗? ***.com/questions/10238399/… 我会考虑使用函数模拟的不同方法。 midge 框架为此提供了许多功能:github.com/marick/Midje 不要在产品和测试中使用不同的数据库。在 java 中寻找数据库集成测试 【参考方案1】:

HSQLDB 与 clojure.java.jdbc 一起使用。

The readme 提到 Korma 是与 clojure.java.jdbc 兼容的库。

我看不出有什么理由不能像在 Java 中那样继续使用 HSQLDB。

【讨论】:

有什么例子可以用它来配置测试吗? 快速搜索后我没有看到示例。您能否提供一个示例,说明您希望测试在您的问题中是什么样的? 我正在关注这个架构 kendru.github.io/restful-clojure/2014/02/16/… 。但我不想使用 vagrant,只使用 docker 进行开发,使用内存数据库进行测试。

以上是关于Clojure 测试中的数据库模拟的主要内容,如果未能解决你的问题,请参考以下文章

Clojure 中的可插拔向量处理单元

测试列表是不是包含 Clojure 中的特定值

在 clojure.jdbc 和 postgres 中使用保存点进行测试的嵌套事务

Clojure基础课程2-Clojure中的数据长啥样?

Clojure基础课程2-Clojure中的数据长啥样?

如何使用 clojure.test 将值从夹具传递到测试?