无法在 Clojure 测试装置中对另一个名称空间中的 var 进行 with-redefs

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

我正在尝试在我的测试装置中重新定义 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

如果我手动将测试值更改为等于生产值,则测试正确通过。

我尝试过的事情

  1. 使用完全限定的命名空间:
(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') 

  1. 然后我确定我正在要求并引用变量:
(:require [app.model.user.pathom :refer [jwt-secret]])

(with-redefs [#'jwt-secret test-jwt-secret]
  (f))

仍然出现与上面 2 中相同的错误

仍然遇到相同的 JWT 验证错误。

环境

  • Clojure 1.11
  • 使用Pathom 3
  • 使用好友签名进行 JWT 处理

问题

如何在我的测试装置中正确地重新定义这个变量?我在命名空间处理或 var 解析中缺少什么?

testing clojure redefinition
1个回答
0
投票

将您的

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 :)

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