0

我有一个控制器,它有一个post_review调用 Rest Client 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

document_manual_result是一个记录方法,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") 

我在我的 before 块中使用了它,它没有做任何事情,我在实际测试中尝试了它,在我post :post_review, @params和 Webmock 似乎什么都不做之前。我认为 webmock 所做的是,它正在侦听对特定 URL 发出的任何请求,并默认返回成功或您指定的选项块。我不确定我是否正确使用它。

4

1 回答 1

2

在这个片段中:

stub_request(:any, "localhost:3001") 

:any指像 GET 或 POST 一样调用的 http 方法。所以你在那个 URL 上存根 GET/POST/whatever 并且只有那个 URL。我的猜测是您发送请求的内容不完全是localhost:3001.

尝试提取Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s到变量中并在运行规范时记录它。我的猜测是您需要将存根更改为可能类似于 localhost:3001/some_resource/1 的 URL。

存根 localhost:3001 上的所有路径

Webmock 还支持通过正则表达式匹配 url:

stub_request(:any, /localhost:3001*/)
于 2016-06-20T14:59:13.880 回答