Midje在Compojure / Ring处理程序中提供了不是存根函数

时间:2015-02-15 16:49:07

标签: unit-testing clojure ring compojure midje

我正在尝试使用Midje在处理程序单元测试中存根视图,但我对Midje(提供)的使用显然不正确。

我已经简化并在处理程序中内联了一个(内容)函数的视图:

(ns whattodo.handler
  (:use compojure.core)
  (:require [whattodo.views :as views]))

(defn content [] (views/index))

(defn index [] (content))

(defroutes app
  (GET "/" [] (index)))

我正在尝试使用

进行测试
(ns whattodo.t-handler
  (:use midje.sweet)
  (:use ring.mock.request)
  (:use whattodo.handler))

(facts "It returns response"
       (let [response (app (request :get "/"))]
         (fact "renders index view" (:body response) => "fake-html"
               (provided (#'whattodo.handler/content) => (fn [] "fake-html")))))

我期待被调用的函数被调用返回'fake-html'并因此返回单元测试,但是测试失败,因为实际的实现被调用 - 调用真实视图。

2 个答案:

答案 0 :(得分:1)

您不需要功能快捷方式,只需使用(content) => ...即可。正如您现在所做的那样,midje希望您的代码按字面(#content)调用,但您的index函数会调用(content)。您对中间语法的困惑可能是您希望将预期结果分配给函数名称,但事实并非如此。你必须更换确切的电话。也就是说,如果您的index函数会使用某个参数调用content,那么您也必须对此进行说明,例如按(provided (content "my content") => ...)

答案 1 :(得分:1)

我今天发现我的范围很混乱 - let阻止引入响应是在包含提供的事实调用之外。因此,响应是在调用提供之前创建的。

通过此早期测试的工作代码使用了背景调用

(facts "It returns response"                                                                                                                          
   (against-background (whattodo.handler/content) => "fake-html")                                                                                 
   (let [response (app (request :get "/"))]                                                                                                       
     (fact "renders index view"                                                                                                                   
           (:body response) => "fake-html")))