Midje обеспечивает функцию не заглушки в обработчике Compojure / Ring

Я пытаюсь использовать 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 ответа

Решение

Сегодня я обнаружил, что мои области были перепутаны - блок 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")))

Вам не нужен ярлык функции, просто используйте (content) => ..., Как у вас есть сейчас, Midje ожидает, что ваш код вызывает буквально (#content), но твой index вызовы функций (content) вместо. Ваша путаница с синтаксисом midje может заключаться в том, что вы ожидаете, что назначаете имени функции ожидаемый результат, но это не так. Вы должны заменить точный вызов. Т.е. если твой index функция будет вызывать content с некоторым аргументом, вам придется учитывать это, например, (provided (content "my content") => ...)

Другие вопросы по тегам