2016-06-20 2 views
0

J'ai un contrôleur, qui a une action post_review qui appelle un appel API Rest Client.Rails webmock décochant appel 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 

Le document_manual_result est un procédé d'enregistrement et la delete_relavent_review_queue est un procédé de type de rappel qui permet de supprimer l'élément.

J'ai écrit plusieurs tests qui testent les effets secondaires de l'action post_review, à savoir qu'il documente que j'ai envoyé le résultat (aka: response_body) et que je supprime un autre objet.

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 

Avant allumé RestClient les essais ont travaillé, mais maintenant que le client reste l'exécute se brise les spécifications. Je voudrais remplacer seulement la partie rest_client.execute de l'action du contrôleur, afin que je puisse tester les autres effets secondaires de la méthode. L'URL que je l'ai pointe vers est localhost:3001 donc j'ai essayé:

stub_request(:any, "localhost:3001") 

Je l'ai utilisé à l'intérieur, mon avant bloc qui ne fait rien et je l'ai essayé dans le test réel il bloc juste avant je post :post_review, @params et Webmock semble ne rien faire. Ce que je pensais que webmock fait, c'est qu'il écoute toutes les demandes faites à une URL spécifique et il renvoie un succès par défaut ou un bloc d'options que vous spécifiez. Je ne suis pas sûr que je l'utilise correctement.

Répondre

1

Dans cet extrait:

stub_request(:any, "localhost:3001") 

:any fait référence à la méthode HTTP pour appeler comme GET ou POST. Donc, vous êtes en train de céder GET/POST/quoi que ce soit sur exactement cette URL et seulement cette URL. Ma conjecture est que ce que vous envoyez des demandes n'est pas exactement localhost:3001. Essayez d'extraire Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s dans une variable et consignez-la lorsque vous exécutez vos spécifications. Ma conjecture est que vous aurez besoin de changer votre talon pour être cette URL qui est probablement quelque chose comme localhost: 3001/some_resource/1.

Pour Stub tous les chemins sur localhost: 3001

Webmock prend également en charge urls correspondant par regex:

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

C'est exactement, je viens de recevoir mon vert de test maintenant. Je pensais que 'stub_request (: any," localhost: 3001 ")' serait comme une couverture globale sur toutes les routes. mais hélas, vous devez être plus précis. +1 merci bud. – TheLegend

+1

@TheLegend vous pouvez le faire aussi, j'ai mis à jour ma réponse – Josh