2015-11-02 1 views
1

Je voudrais écrire des tests pour un web-service Pedestal.Clojure - test a pedestal route

Si je:

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

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

Comment puis-je écrire un test pour cela?

(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. 
    ...) 

Modifier: est ce que j'essayé ici:

(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"))))) 

Mais je reçois une exception:

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

Avez-vous regardé https://github.com/ring-clojure/ring-mock? – ez121sl

+0

@ ez121sl Je l'ai fait, je l'utilise déjà avec une application compojure, permettez-moi de modifier ma question. – nha

+1

'defroutes' de Compojure crée un gestionnaire d'anneau ou quelque chose de ce genre. La version de Pedestal est apparemment différente. Leur exemple de test n'utilise pas ring-mock: https://github.com/pedestal/pedestal/blob/master/samples/hello-world/test/hello_world/service_test.clj – ez121sl

Répondre

1

Donc, après avoir posé la question, je lié ohpaulez a répondu:

@nha - Merci d'utiliser Pedestal! Désolé votre question n'a pas obtenu une réponse sur StackOverflow - Je ne pense pas que quelqu'un surveille SO pour questions de piédestal. Le meilleur endroit pour poser ce genre de questions est sur le mailing list.

navires piédestal avec son propre utilitaire pour faire des demandes directement à le servlet (similaire à anneau/faux, bien que je n'ai jamais utilisé moi-même simulé ) appelé response-for. Le modèle Pedestal Service génère un test automatiquement pour vous. Consultez l'un des samples pour un exemple .

Notez également que ledit response-for ne supporte pas encore les réponses asynchrones (donc mes itinéraires qui utilise des intercepteurs asynchrones avec core.async a échoué - je devais les rendre synchrone).