是否有一种不太脏的方法在运行时检测代码是否以lein test
启动?我只是想选择一个不同的redis数据库,所以像environ这样的解决方案或使用不同的资源文件似乎有点矫枉过正。
例如,leiningen会自动启用测试配置文件,但我还没有找到获取当前启用的配置文件列表的方法。
答案 0 :(得分:1)
没有简单的方法可以做到这一点。 lein.test
和clojure.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"
因为配置文件根据配置文件而变化。