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

时间:2014-01-10 10:58:39

标签: authentication testing clojure friend midje

我正在使用朋友保护我的网络应用程序中的某些页面,到目前为止工作正常。我遇到了我的测试代码问题:我似乎无法解决身份验证机制或模拟朋友的授权调用。到目前为止我尝试过的事情:

  • 使用包含身份验证信息的地图包装请求
  • 使用midje /提供来模拟对朋友/授权的调用

第一种方法似乎不起作用,因为我不确定我需要添加到请求中,第二种似乎不起作用,因为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)))

这是相应的(正在运行的)compojure路线:

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

我基本上在事实中宏观扩展了friend/authorize电话,但由于授权,我仍然得到两个失败的事实。在添加授权之前测试成功运行,因此它确实是我需要解决的朋友授权部分。

有没有最佳实践可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

事实证明,我对Midje的provided功能过于乐观。假设在可检查过程中调用了模拟代码,它与一个可检查项紧密相关。即以下是我的工作:

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

答案 1 :(得分:0)

如果authorized?完全被调用,这实际上取决于你朋友的auth工作流程。

另外,我永远不会让midje做运行时模拟,所以我通常使用with-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)"))