我正在尝试在我的测试装置中重新定义 JWT 秘密,但无法使用 with-redefs 与来自另一个名称空间的 var 正确工作。
我在我的 pathom 命名空间中定义了一个 JWT 秘密
(app.model.user.pathom)
;; In app.model.user.pathom
(def jwt-secret "production-secret")
在我的测试中,我尝试使用测试装置通过测试秘密来覆盖它:
;; In test namespace
(ns app.model.user.pathom-test
(:require [app.model.user.pathom :refer [jwt-secret]]))
(def test-jwt-secret "test-secret")
(defn with-jwt-secret [f]
(with-redefs [jwt-secret test-jwt-secret]
(f)))
(use-fixtures :each (join-fixtures [db-cleanup-fixture
email-fixture
with-fixed-time
with-jwt-secret]))
它是这样使用的
(defn generate-token [user-id client-type]
(jwt/sign claims jwt-secret {:alg :hs256})))
重新定义似乎没有生效——测试中仍在使用原始的生产密钥。我们测试中的 JWT 验证错误证明了这一点:
Caused by: clojure.lang.ExceptionInfo: Message seems corrupt or manipulated
如果我手动将测试值更改为等于生产值,则测试正确通过。
(with-redefs [app.model.user.pathom/jwt-secret test-jwt-secret]
(f))
2.使用阅读器宏:
(with-redefs [#'app.model.user.pathom/jwt-secret test-jwt-secret]
(f))
这会导致错误
Caused by: java.lang.ClassCastException: class clojure.lang.Cons cannot be cast to class clojure.lang.Symbol (clojure.lang.Cons and clojure.lang.Symbol are in unnamed module of loader 'a pp')
(:require [app.model.user.pathom :refer [jwt-secret]])
(with-redefs [#'jwt-secret test-jwt-secret]
(f))
仍然出现与上面 2 中相同的错误
仍然遇到相同的 JWT 验证错误。
如何在我的测试装置中正确地重新定义这个变量?我在命名空间处理或 var 解析中缺少什么?
将您的
jwt-secret
移动到pathom中的
env
目前:
(def jwt-secret ...)
(pco/defresolver authed [_ _]
{::pco/output [::authed]}
;; if not throw, authed
(buddy/unsign jwt-token ...)
{::authed true})
推荐
(pco/defresolver authed [{::keys [jwt-secrect]} _]
{::pco/output [::authed]}
;; if not throw, authed
(buddy/unsign jwt-token ...)
{::authed true})
这使您在测试期间更容易控制/替换 var :)