使用core.test测试clojure中的夜光渲染

时间:2014-03-19 07:51:14

标签: clojure

此代码来自默认的luminus模板:

(deftype RenderableTemplate [template params]
  Renderable
  (render
    [this request]
    (content-type
      (->>
        (assoc
          params
          (keyword (s/replace template #".html" "-selected"))
          "active"
          :servlet-context
          (:context request)
          :user-id
          (session/get :user-id)
          :user
          (session/get :user))
        (parser/render-file (str template-path template))
        response)
      "text/html; charset=utf-8")))

(defn render [template & [params]]
  (RenderableTemplate. template params))

我需要使用clojure.test来测试这个函数:

(defn home-page [& [user]]
  (layout/render
    "home.html"
   {:user user}))

如何使用与键:user相关联的值测试上述函数?

3 个答案:

答案 0 :(得分:0)

我建议您在发布一般性问题之前阅读一些文档并做出合理的努力。这可能是一个开始http://blog.jayfields.com/2010/08/clojuretest-introduction.html

在您对clojure测试感到有点舒服之后,您可能希望转到https://github.com/marick/Midje/wiki/A-tutorial-introduction-for-Clojure.test-users

享受:)

答案 1 :(得分:0)

首先设置你的路线和处理程序:

(defn home-page [& [user]]
  (layout/render
    "home.html"
   {:user user}))


; setting routes
(defroutes main-routes
  (GET "/user/:user" [user] (home-page user)))

然后进行单元测试:

基本单元测试

(deftest home-page-test
  ; Check if response code is 200
  (is (= 200 (:status (main-routes {:request-method :get :uri "/user/Michael"})))))

或者您也可以使用Midje

使用Midje

(:use midje.sweet
      clojure.test)

(fact "Homepage Test"
  (:status (main-routes {:request-method :get :uri "/user/Michael")) => 200) 

答案 2 :(得分:-1)

我遇到了同样的问题。 直接调用(主页)将返回RenderableTemplate类型,该类型对测试无用。

在您的测试中需要:

(:require [capacityplanning.layout :as layout]
             [selmer.parser :as parser])

添加此功能:

(def template-path "templates/")
(defn mockRender [template params]
  (parser/render-file (str template-path template) params))

在你的测试中你可以绑定:

(with-redefs [layout/render mockRender]
          (home-page user))

现在调用主页时,它会将html作为字符串返回。这对于编写单元测试应该更有用。