2015-11-02 147 views
1

我想爲Pedestal網絡服務編寫測試。Clojure - 測試Pedestal路線

如果我有:

(defn pong 
    [request] 
    (ring-resp/response "pong")) 

(defroutes routes[[["/" {:get pong}]]]) 

我怎麼會寫一個測試?

(deftest alive-system 
    (testing "ping-pong route" 
    ;; How do I test my route ? 
    ;; If possible : 
    ;; - I would like to have direct access to it 
    ;; ie. no need to bind pedestal to a port would be nice 
    ;; - The ability to omit some interceptors would be nice also, 
    ;; as it would allow me to receive plain Clojure data structures 
    ;; instead of, for instance, JSON which I would have to parse. 
    ...) 

編輯: 這裏是我的嘗試:

(deftest alive-system 
    (testing "ping-pong route" 
    (let [response (my-other.ns/routes (mock/request :get "/ping"))] 
     (is (= (:status response) 200)) 
     (is (= (:body response) "pong"))))) 

但我得到一個異常:

ERROR in (alive-system) (service_test.clj:13) 
Uncaught exception, not in assertion. 
expected: nil 
    actual: java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn 
+0

你看過https://github.com/ring-clojure/ring-mock嗎? – ez121sl

+0

@ ez121sl我做了,我已經使用它與compojure應用程序,讓我編輯我的問題。 – nha

+1

Compojure的'defroutes'創建一個戒指處理器或其他類似的東西。基座的版本顯然不同。他們的示例測試不使用ring-mock:https://github.com/pedestal/pedestal/blob/master/samples/hello-world/test/hello_world/service_test.clj – ez121sl

回答

1

所以要求對這個問題後,我聯繫ohpaulez回答:

@nha - 感謝您使用Pedestal!對不起,你的問題沒有得到StackOverflow的 答案 - 我不認爲任何人都會監視 基座問題。詢問這些問題的最佳地點是 ,mailing list

底座附帶了自己的效用直接發出請求 該servlet(類似於環/模擬,雖然我從來沒有用過模擬 我)叫response-for。 Pedestal Service模板爲您自動生成 測試。查看samples的其中一個 示例。

還要注意的是說response-for還不支持異步響應(所以我的路線是使用異步攔截器與core.async失敗 - 我必須讓他們同步)。