2017-03-01 7 views
1

Clojure統合テストでは、アウトバウンドHTTPリクエストをサードパーティにスタブするために広く使われているパターンやソリューションがあるのだろうか(Rubyのwebmock)。私は(with-fake-http [] ...)のようなもので自分のテストをラップすることなく、あるいは依存性注入に頼らなくても、高レベル(例えば、セットアップ機能)でリクエストをスタブすることができます。ClojureテストでHTTP要求をスタブするための戦略

これは動的なvarの良いユースケースですか?セットアップのステップで問題の名前空間に到達し、副作用関数を無害な無名関数に設定することができます。しかし、これは大変だと感じています。私はテストに対応するためにアプリケーションコードを変更する考えが嫌いです。 (それはまた、上記の解決策よりはるかに優れていません)

偽の関数を含むテスト固有のnsを入れ替えるのは意味がありますか?私のテストでこれを行うためのきれいな方法がありますか?あなたがリング/ compojureフレームワークを使用して良い例を見ることができます

+1

ほとんどの(すべて?)clojure httpライブラリはリクエストと応答をマップとして表していますので、テストでこれらを直接模擬しなくても構いません。 – Lee

+0

依存性注入の問題点は何ですか?あなたの関数で*ハードコーディングURL *ですか?あなたはそれをしてはならないので、それは悪いです。 –

答えて

1

私は同じような状況にありましたが、自分のニーズを満たすClojureライブラリを見つけることができず、Stub HTTPという独自のライブラリを作成しました。使用例:

(ns stub-http.example1 
    (:require [clojure.test :refer :all] 
      [stub-http.core :refer :all] 
      [cheshire.core :as json] 
      [clj-http.lite.client :as client])) 

(deftest Example1 
    (with-routes! 
     {"/something" {:status 200 :content-type "application/json" 
        :body (json/generate-string {:hello "world"})}} 
     (let [response (client/get (str uri "/something")) 
      json-response (json/parse-string (:body response) true)] 
     (is (= "world" (:hello json-response)))))) 
+1

ありがとうございます。私はあなたの図書館を調査し、フォローアップします。 :) – pdoherty926

0

:この例では

(ns http) 

(defn post [url] 
    {:body "Hello world"}) 

(ns app 
    (:require [clojure.test :refer [deftest is run-tests]])) 

(deftest is-a-macro 
    (with-redefs [http/post (fn [url] {:body "Goodbye world"})] 
    (is (= {:body "Goodbye world"} (http/post "http://service.com/greet"))))) 

(run-tests) ;; test is passing 

> lein new compojure sample 
> cat sample/test/sample/handler_test.clj 


(ns sample.handler-test 
    (:require [clojure.test :refer :all] 
      [ring.mock.request :as mock] 
      [sample.handler :refer :all])) 

(deftest test-app 
    (testing "main route" 
    (let [response (app (mock/request :get "/"))] 
     (is (= (:status response) 200)) 
     (is (= (:body response) "Hello World")))) 

    (testing "not-found route" 
    (let [response (app (mock/request :get "/invalid"))] 
     (is (= (:status response) 404))))) 

更新

アウトバウンドHTTP呼び出しのために、あなたは便利with-redefsを見つけることができます元の関数postは "Hello world"を返します。ユニットテストでは、 "Goodbye world"を返すスタブ関数を使用して、postを一時的にオーバーライドします。

詳細ドキュメントis at ClojureDocs

+0

ありがとうございます。私は、私がスタブしようとしているリクエストのタイプについてより具体的になるように質問を更新しました。具体的には、私のアプリケーションからサードパーティへの送信要求。 – pdoherty926

+0

ありがとう、もう一度。私はあなたの提案とフォローアップ(それは数日かもしれない)で実験します。一見すると、ネストされた関数呼び出しが何をしているかについての親密な知識が必要なので、これはwebmockのようなソリューションに比べてかなり重いです。 – pdoherty926

関連する問題