使用动态可变的leiningen插件结合

问题描述 投票:1回答:2

我有一个手动运行我clojure.test代码雷音插件。它声明动态变量baseuri,我想从我的测试中访问。我会带出并修改代码以获取开门见山。在这里,我的插件里面,我有一个创建动态baseuri变量,并将其设置为空字符串配置文件。

;; myplugin
;; src/myplugin/config.clj
(ns leiningen.myplugin.config)    
(def ^:dynamic baseuri "")

从内部插件将动态baseuri变量并运行测试与clojure.test任务:

;; src/myplugin/runtests.clj
(ns leiningen.myplugin.runtests
      (:require [leiningen.myplugin.config :as config]
                [clojure.test]
                [e2e.sometest]))

(defn run [project]
  (binding [config/baseuri "https://google.com/"]
    (println config/baseuri) ;; <-- prints google url
    ;; run clojure.test test cases from e2e.sometest namespace
    ;; This will call the `sampletest` test case
    (clojure.test/run-tests e2e.sometest)
  ))

而我clojure.test里面我尝试使用基本URI变量,但结合不成立。它的价值是什么,我原本宣布baseuri为(空字符串)

;; tests/e2e/sometest.clj
(ns e2e.sometest
  (:require [leiningen.myplugin.config :as config]))

(deftest sampletest
  (println config/baseuri))  ;; <-- Prints an empty string instead of google url

我编辑的代码的基本方式,以显示clojure.test情况下是如何运行的。我简单地传递在命名空间我想运行到clojure.test/run-tests方法。

plugins clojure leiningen clojure.test
2个回答
1
投票

我认为,当涉及到你的参数化测试clojure.test实现是不是最佳的。

我不知道为什么你的binding形式不工作 - 我已经检查在clojure.test的代码,我看不出有什么可能是错误的。我会检查:

  • 作为binding建立测试得到相同的线程中执行(也许你可以添加登录插件,并在您的测试的线程名/ ID)
  • 不同的类装载器引起你的插件名字空间和全局动态变量实际上是加载并定义了两次

我有一个想法多(我真的不想骂你的解决方案,只是想找到替代解决方案:)):你的问题是从像测试脚本配置外部资源通过测试的全局配置选项的代码。你有没有想过将它们作为环境变量?你可以很容易地使用(System/getenv "baseuri")environ阅读。


0
投票

也许你有非常特殊的原因一个动态无功,但是,只要你不状态,以便明确,我在这里拍摄。

避免瓦尔的动态重新绑定。在最理想的情况下,避免全局状态可言,而不是重新定义你的函数采取基本URI作为参数。 或者重构你的应用程序没有静态瓦尔有必要在所有,就像你有它现在。

编辑我的猜测是,你的功能:

(defn run [project]
  (binding [config/baseuri "https://google.com/"]
    (println config/baseuri) ;; <-- prints google url
    ;; runs clojure.test code here …
  ))

(deftest sampletest
  (println config/baseuri))

没有连接任何关系。至少我没有看到他们应该如何。您正在运行一个测试,并打印其他一些变量var而不用重新绑定它。 也许你可以添加一个链接到一个回购协议,以最小的可再现的测试用例,以更好地理解它?

© www.soinside.com 2019 - 2024. All rights reserved.