2016-06-20 14 views
0

コントローラがあり、これにはRestクライアントAPIコールを呼び出すpost_reviewアクションがあります。 document_manual_resultRails webmock localhost API呼び出しをスタブアウト

def post_review 
    ... 
    headers = { "CONTENT_TYPE" => "application/json", 
       "X_AUTH_SIG" => Rails.application.secrets[:platform_receiver_url][:token] } 
    rest_client.execute(:method => :put, 
         :url => Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s, 
         :content_type => :json, 
         :payload => response_body.to_json, 
         :headers => headers) 
    document_manual_result(response_body) 
    delete_relavent_review_queue(params[:review_queue_id]) 
    ... 
end 

ロギング方法であり、delete_relavent_review_queueは、アイテムが削除されたコールバック型の方法です。

post_reviewアクションの副作用をテストしている、つまり結果(別名:response_body)を送信し、別のオブジェクトを削除していることをテストしているテストを書いています。

describe "Approved#When manual decision is made" do 
    it "should delete the review queue object" do 
     e = Event.create!(application_id: @review_queue_application.id) 
     login_user @account 
     post :post_review, @params 
     expect{ReviewQueueApplication.find(@review_queue_application.id)}.to raise_exception(ActiveRecord::RecordNotFound) 
    end 

    it "should update the event created for the application" do 
     e = Event.create!(application_id: @review_queue_application.id) 
     login_user @account 
     post :post_review, @params 
     expect(Event.find(e.id).manual_result).to eq(@manual_result) 
    end 
    end 

私はテストが働いRestClientオンが、今その残りのクライアントは、それが仕様を破っている実行される前に。 私はコントローラのアクションの一部だけをrest_client.executeでスタブしたいので、メソッドの他の副作用をテストできます。私はそれが指しているURLがlocalhost:3001ので、私が試している:

stub_request(:any, "localhost:3001") 

私は、内の何もしなかった私の前のブロックを、それを使用して、私は実際の試験の内側それを試してみました、それはブロックだけ私の前にはpost :post_review, @paramsとWebmockは何もしていないようです。私はwebmockは、特定のURLに対して行われているリクエストを聞いており、デフォルトで成功したか、指定したオプションのブロックを返すということです。私はこれを正しく使用しているかどうかわかりません。このスニペットで

答えて

1

stub_request(:any, "localhost:3001") 

:anyは、GETやPOSTのように呼び出すためにHTTPメソッドを指します。だからあなたはGET/POST /そのURLとそのURLだけをスタブしています。私の推測では、あなたが要求を送信しているのは、正確にはlocalhost:3001ではないということです。

Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_sを変数に抽出して、スペックを実行するときにログに記録してください。私の推測では、localhost:3001/some_resource/1のようなURLになるようにスタブを変更する必要があります。 3001

Webmockも正規表現でURLをマッチングサポートされています:ローカルホスト上のすべてのパススタブに

stub_request(:any, /localhost:3001*/) 
+0

まさにそれで、私はちょうど今、私のテストの緑を得ました。私は、 'stub_request(:any、" localhost:3001 ")'がすべてのルートをカバーするグローバルなカバーのようになると考えました。しかし、あなたはユーバー固有のものでなければなりません。 +1のおかげ。 – TheLegend

+1

@TheLegendあなたもそれを行うことができます、私は私の答えを更新しました – Josh

関連する問題