【问题标题】:Compojure/ring app, initialize database outside test-scopeCompojure/ring 应用程序,在测试范围之外初始化数据库
【发布时间】:2016-03-18 08:47:56
【问题描述】:

如何初始化我的数据库,以便我的 (def db ...) 在运行我的单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。

我在函数(with-redefs)中模拟了 sql 和 dml,但到目前为止我发现的所有示例都只是直接在命名空间中定义数据库(例如,不包含在函数中)。

【问题讨论】:

    标签: unit-testing clojure compojure ring korma


    【解决方案1】:

    我强烈建议您不要将数据库放在 Var 中。这是一种非常诱人但非常有害的环境耦合形式。

    推荐的方法是将数据库作为需要在其主体中访问它的任何函数的参数传递:

    ;; BAD
    (def db ...)
    
    (defn find-user [user-id]
      (run-query find-user-query db user-id))
    
    ;; GOOD
    (defn find-user [db user-id]
      (run-query find-user-query db user-id))
    

    它并不像您想象的那么乏味,而且好处很大(用于测试、repl 驱动的开发等)。


    注意:

    在 Clojure 社区的早期,人们一直在使用动态变量来避免一直添加参数。

    (def ^:dynamic db nil)
    
    (binding [db ...]
      (find-user user-id))
    

    然后我们学会了停止这样做 :) 将你的逻辑与它的环境结合起来只是你的程序的一个糟糕的基础。

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2023-03-13
      相关资源
      最近更新 更多