[英]Using a dynamic variable binding in a leiningen plugin
我有一個手動運行我的 clojure.test 代碼的 lein 插件。 它聲明了一個我希望從我的測試中訪問的動態變量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 內部,我嘗試使用 baseuri 變量,但綁定不成立。 它的值是我最初聲明的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
方法。
我同意clojure.test
實現在參數化測試方面不是最佳的。
我不確定為什么您的binding
表單不起作用 - 我已經檢查了clojure.test
的代碼,但我看不出有什么問題。 我會檢查是否:
測試在建立binding
的同一線程中執行(也許您可以在插件和測試中添加記錄線程名稱/ID)
不同的類加載器導致你的插件命名空間和它的全局動態變量實際上被加載和定義了兩次
我還有一個想法(我真的不想批評您的解決方案,只是試圖找到替代解決方案:)):您的問題是將全局配置選項從外部源(如測試腳本配置)傳遞給您的被測代碼。 你有沒有想過將它們作為環境變量傳遞? 您可以使用(System/getenv "baseuri")
或environ輕松讀取它們。
也許出於非常具體的原因,您有一個動態變量,但是,由於您沒有明確說明,我在這里試一試。
避免動態重新綁定變量。 在最好的情況下,完全避免全局狀態,而是重新定義您的函數以將 baseuri 作為參數。
或者重構您的應用程序,完全不需要靜態變量,就像您現在擁有的那樣。
編輯我的猜測是你的功能:
(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 而不重新綁定它。
也許您可以將存儲庫的鏈接添加到最小的可重現測試用例以更好地理解它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.