我正在尝试为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?
纵观源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
创建测试请求。它使您与此类事物隔离了一点。