【问题标题】:Detect leiningen test mode检测 leiningen 测试模式
【发布时间】:2016-04-27 12:52:05
【问题描述】:

有没有一种不太脏的方法可以在运行时检测代码是否以lein test 开头?我只是想选择一个不同的redis数据库,所以像environ或使用不同的资源文件这样的解决方案似乎有点矫枉过正。

例如,leiningen 自动启用测试配置文件,但我还没有找到获取当前启用配置文件列表的方法。

【问题讨论】:

标签: clojure leiningen


【解决方案1】:

没有简单的方法可以做到这一点。 lein.testclojure.test 都不会公开此类信息。即使您找到一种方法来破解 lein test 或 clojure.test 的一些私有变量并检查它以确定您的代码是否作为 lein test 的一部分运行。

但是,它会有一个非常大的问题:您的生产代码需要require 测试库代码(例如clojure.test),或者更糟糕的是您的构建工具代码(lein test 插件代码)。

您可以尝试在生产代码中定义此类配置变量(动态或非动态),并使用夹具在测试中进行设置。

最好的解决方案是根据系统属性或环境变量等外部变量动态配置您的应用程序(例如,使用建议的environ)。这样,您可以根据需要拥有尽可能多的不同配置集(例如产品与单元测试、集成测试与性能测试等),而不仅仅是两个(产品与测试)。

【讨论】:

    【解决方案2】:

    这似乎有点矫枉过正,但例如组件是为这样的确切用例而发明的。或者一般的依赖注入。

    我知道那种感觉,这只是一个私人项目,不需要困难的东西等。这就是为什么我把自己的模板放在一起,这样我只需运行lein new ...
    这是我规避“只想选择不同的redis数据库”用例的解决方案。

    编辑它是一个 Web 框架的模板:https://github.com/sveri/closp,但其中很多部分并非特定于 Web 开发,尤其是组件部分:https://github.com/sveri/closp/tree/master/resources/leiningen/new/closp/clj/components
    还有一个集成测试,我专门使用了测试组件:https://github.com/sveri/closp/blob/master/resources/leiningen/new/closp/integtest/clj/web/setup.clj

    【讨论】:

    • 这个模板在github上吗? :-) 即使它是针对您的,也很高兴有更多示例供其他人学习
    【解决方案3】:

    我找到了Cprop 的方法。在“env/{test|prod|test}/config.clj”文件中设置一个变量:

    (System/setProperty "lein.profile" "dev")
    

    然后你可以读取值:

     (require '[cprop.source :as source])
     (str "from-system-props: >> " (:lein-profile (source/from-system-props)))
    

    其他选项是在 system-props 中搜索键“:conf”:

    :conf "test-config.edn"
    

    因为配置文件会根据配置文件更改。

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2016-02-26
      • 1970-01-01
      • 2012-08-17
      • 2021-03-09
      • 2014-02-13
      • 1970-01-01
      • 2015-01-27
      • 2017-02-02
      相关资源
      最近更新 更多