2016-06-20 20 views
0

У меня есть контроллер, который имеет действие post_review, которое вызывает вызов API клиента клиента.Rails webmock stubbing localhost api call

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 

document_manual_result является методом регистрации и delete_relavent_review_queue является методом типа обратного вызова, который будет удалить элемент.

Я написал несколько тестов, которые проверяют побочные эффекты действия post_review, а именно, что он документирует, что я отправил результат (aka: 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 тесты работали, но теперь, когда клиент остальное выполняет Это нарушает спецификации. Я хотел бы заглушить только часть действия контроллера, поэтому я могу проверить другие побочные эффекты метода. URL, он у меня указывая на это localhost:3001 поэтому я попытался:

stub_request(:any, "localhost:3001") 

Я использовал его в течение, мой перед блок, который ничего не делал, и я попытался его в настоящем тесте это блок просто до I post :post_review, @params и Webmock, кажется, ничего не делает. То, что я думал, что вебмок делает, заключается в том, что он слушает любые запросы, сделанные с определенным URL-адресом, и он возвращает успех по умолчанию или блок опций, которые вы указали. Я не уверен, что правильно использую это.

ответ

1

В этом фрагменте:

stub_request(:any, "localhost:3001") 

:any относится к методу HTTP назвать как GET или POST. Таким образом, вы завершаете GET/POST/независимо от того, что именно этот URL и только этот URL. Мое предположение заключается в том, что то, что вы отправляете запросы, не точно localhost:3001.

Попробуйте извлечь Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s в переменную и зарегистрировать ее при запуске своих спецификаций. Я предполагаю, что вам нужно будет изменить свой заглушку, чтобы быть тем URL-адресом, который, скорее всего, похож на localhost: 3001/some_resource/1.

тупикового все пути на локальном хосте: 3001

Webmock также поддерживает соответствие контента, регулярное выражение:

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

Именно это, я только что получил мой тест зеленый прямо сейчас. Я думал, что 'stub_request (: any," localhost: 3001 ")' будет похож на глобальную обложку по всем маршрутам. но, увы, вы должны быть более узкими. +1 спасибо бутон. – TheLegend

+1

@ TheLegend, вы тоже можете это сделать, я обновил свой ответ – Josh

 Смежные вопросы

  • Нет связанных вопросов^_^