【问题标题】:Clojure database unit testing / mockingClojure 数据库单元测试/模拟
【发布时间】:2011-07-22 21:49:44
【问题描述】:

我最近刚开始研究一个数据库密集型 Clojure 应用程序,并试图进行一些单元测试。理想情况下,我想通过模拟一些东西来避免实际访问真正的数据库。

这是一个简单测试的例子:

test-core.clj

(deftest core-test
  (is (> (count (fn-under-test "foo")) 0)))

core.clj

(defn fn-under-test [slug]
  (db/query "select * from %1" slug))

db.clj

(defn query [q & args]
  (sql/with-connection db
    (sql/with-query-results res
      [(clause q args)]
      (doall res))))

我的问题:有没有办法从 test-core.clj 中将自定义函数绑定到“db/query”,这样 core.clj 将使用它,而不是 db.clj 中的定义?

谢谢!

【问题讨论】:

    标签: database testing clojure mocking


    【解决方案1】:

    您可以使用binding 尝试覆盖db/query,但您需要先定义命名空间和var。最简单的方法是将 db.clj 导入同一个命名空间,然后使用绑定。

    (ns test-core
        (:use clojure.test)
        (:require db))
    
    (deftest core-test
      (binding [db/query (fn [query & args] (comment return some value here))]
        (is (> (count (fn-under-test "foo")) 0))))
    

    【讨论】:

    • 谢谢!我今天早些时候尝试使用绑定(和绑定),但无法成功 - 我一直在线程“main”java.lang.Exception中收到Exception:无法解析var:db /在此上下文中查询.
    • 您可以尝试在测试中要求 db.clj,然后使用绑定。
    • 注意:从 Clojure 1.3 开始,binding 只能在使用动态元数据声明变量的情况下工作。请改用with-redefs 来避免此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多