检测leiningen测试模式

时间:2016-04-27 12:52:06

标签: clojure leiningen

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

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

3 个答案:

答案 0 :(得分:1)

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

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

您可能会尝试在生产代码中定义此类配置var(动态或非动态),并使用fixture来在测试中设置它。

最佳解决方案是根据外部变量(如系统属性或环境变量)动态配置应用程序(例如,使用建议的environ)。通过这种方式,您可以根据需要配置多个不同的配置集(例如prod vs unit test vs integration test vs performance tests等),而不仅仅是两个(prod vs test)。

答案 1 :(得分:1)

它可能看起来有点矫枉过正,但例如组件是针对这样的精确用例而发明的。或者一般依赖注入。

我知道这种感觉,它只是一个私人项目,不需要困难的东西等。这就是为什么我把我自己的模板放在一起,以便我需要开始运行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

答案 2 :(得分:0)

我找到了使用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)))

另一种选择是在系统属性中搜索键“:conf”:

:conf "test-config.edn"

因为配置文件根据配置文件而变化。