我正在尝试为compojure静态内容路由编写测试。 我正在通过直接检查振铃响应来测试路线。
最小的工作示例如下:
;; src/testing-webapps.core.clj
(ns testing-webapps.core
(:use [compojure.core]
[compojure.route :as route]))
(defroutes web-app
(route/resources "/")
(route/not-found "404"))
;; test/testing-webapps.core_test.clj
(ns testing-webapps.core-test
(:require [clojure.test :refer :all]
[testing-webapps.core :refer :all]))
(defn request [resource web-app & params]
(web-app {:request-method :get :uri resource :params (first params)}))
(deftest test-routes
(is (= 404 (:status (request "/flubber" web-app))))
(is (= "404" (:body (request "/flubber" web-app))))
(is (= 200 (:status (request "/test.txt" web-app)))))
测试404路线可以正常工作,但调用(request "/test.txt" web-app)
会导致NullPointerException
中出现意外ring.middleware.file-info/not-modified-since?
。
这是堆栈跟踪的顶部:
ERROR in (test-routes) (file_info.clj:27)
Uncaught exception, not in assertion.
expected: nil
actual: java.lang.NullPointerException: null
at ring.middleware.file_info$not_modified_since_QMARK_.invoke (file_info.clj:27)
ring.middleware.file_info$file_info_response.doInvoke (file_info.clj:44)
clojure.lang.RestFn.invoke (RestFn.java:442)
ring.middleware.file_info$wrap_file_info$fn__917.invoke (file_info.clj:64)
[...]
静态路由在浏览器中正常工作,但在通过我的request
函数调用时则无效。
是否有更简单的方法在compojure中测试静态路由?为什么在使用自己的请求映射调用静态路由时会出现NullPointerException?
答案 0 :(得分:4)
查看not-modified-since?
的来源,我认为问题是您的请求映射中没有标题,因此它会在此expr上抛出一个NPE:(headers "if-modified-since")
。尝试更改request
方法,如下所示:
(defn request [resource web-app & params]
(web-app {:request-method :get
:headers {"content-type" "text/plain"} ; added a header
:uri resource
:params (first params)}))
您也可以考虑使用ring-mock
来创建测试请求。它让你有点像这样的东西。