2016-06-20 6 views
0

Ich habe einen Controller, der eine post_review Aktion hat, die einen Rest Client API-Aufruf aufruft.Rails webmock stubbing localhost api Anruf

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 

Die document_manual_result ist eine Logging-Methode und die delete_relavent_review_queue ist eine Callback-Typ-Methode, die das Element gelöscht werden.

Ich habe mehrere Tests geschrieben, die die Nebenwirkungen der post_review-Aktion testen, nämlich dass es dokumentiert, dass ich das Ergebnis gesendet habe (aka: response_body) und dass ich ein anderes Objekt lösche.

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 

Vor drehte ich RestClient auf die Tests gearbeitet, aber jetzt, dass Rest-Client ausgeführt wird Es ist die Spezifikationen zu brechen. Ich möchte nur den rest_client.execute Teil der Controller-Aktion stubben, damit ich die anderen Nebenwirkungen der Methode testen kann. Die URL hat ich es zeigen localhost:3001, ist so habe ich versucht:

stub_request(:any, "localhost:3001") 

habe ich es in meinem vor Block, der nichts zu tun hat und ich versuchte, es in dem eigentlichen Test es Block nur vor mir post :post_review, @params und Webmock scheint nichts zu tun. Was ich dachte webmock ist, dass es alle Anfragen an eine bestimmte URL abgehört und es gibt standardmäßig einen Erfolg oder einen Block von Optionen, die Sie angeben. Ich bin mir nicht sicher, ob ich das richtig benutze.

Antwort

1

In diesem Snippet:

stub_request(:any, "localhost:3001") 

:any bezieht sich auf die HTTP-Methode wie GET oder POST zu nennen. Also stempeln Sie GET/POST/was auch immer auf genau dieser URL und nur dieser URL ab. Meine Vermutung ist, dass das, woran Sie Anfragen senden, nicht genau localhost:3001 ist.

Versuchen Sie, Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s in eine Variable zu extrahieren und protokollieren Sie, wenn Sie Ihre Spezifikationen ausführen. Meine Vermutung ist, dass Sie Ihren Stub ändern müssen, um diese URL zu sein, die wahrscheinlich so etwas wie localhost: 3001/some_resource/1 ist.

Um alle Pfade auf localhost Stub: 3001

Webmock unterstützt auch URLs von regex passend:

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

das genau ist es, ich habe gerade jetzt mein Test grün. Ich dachte, dass 'stub_request (: any," localhost: 3001 ")" wäre wie eine globale Abdeckung über alle Routen. aber ach, du musst sehr genau sein. +1 Dank Knospe. – TheLegend

+1

@TheLegend können Sie das auch tun, habe ich meine Antwort aktualisiert – Josh