使用Friend在Clojure web应用程序的单元测试中忽略身份验证



我正在使用friend来保护我的web应用程序中的一些页面,到目前为止,它运行良好。不过,我的测试代码遇到了问题:我似乎无法绕过身份验证机制,也无法模拟朋友的授权调用。到目前为止我尝试过的东西:

  • 使用包含身份验证信息的映射包装请求
  • 使用midje/provided模拟给朋友/授权的呼叫

第一种方法似乎不起作用,因为我不确定需要在请求中添加什么,第二种方法似乎也不起作用。因为midje似乎根本看不到对朋友/授权的调用。相关事实如下:

(fact "The users page can be fetched successfully"
(let [req (request :get "/user")
response (app req)]
(:body response) => #"(some results)"
(provided 
(friend/authorized? anything anything) => true)))

这是相应的(正在运行的)compjure路由:

(GET "/user" [] (friend/authorize #{::admin} users))

我基本上在midje事实中宏扩展了friend/authorize调用,但由于授权的原因,我仍然在事实上得到了两个FAILS。在添加授权之前,测试运行成功,所以这确实是我需要解决的朋友授权部分。

有什么最佳实践可以解决这个问题吗?

事实证明,我对Midje的provided功能过于乐观。它与一个可检查性密切相关,假设在可检查性过程中调用了模拟代码。也就是说,现在对我来说是可行的:

(fact "The users page can be fetched successfully" 
(app (request :get "/user")) => (contains {:status 200}) 
(provided 
(friend/authorized? anything anything) => true))

是否会调用authorized?实际上取决于您朋友的身份验证工作流。

此外,我从来没有让midje进行运行时模拟,所以我通常使用redefs 模拟函数

以下内容应该对您有效:

(fact "The users page can be fetched successfully"
(let [req (request :get "/user")
response (app req)]
(with-redefs [friend/authorize (fn [roles f] f)]
(:body response)) => #"(some results)"))

最新更新