Rails webmock 停止本地主机 api 调用
Rails webmock stubbing out localhost api call
我有一个控制器,它有一个 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 我已经指出了to 是 localhost:3001
所以我试过:
stub_request(:any, "localhost:3001")
我在里面使用了它,我的 before 块没有做任何事情,我在实际测试中尝试了它 it 块在我 post :post_review, @params
和 Webmock 似乎什么都不做之前。我认为 webmock 所做的是,它正在侦听对特定 URL 发出的任何请求,并且它 returns 默认成功或您指定的选项块。我不确定我是否正确使用了它。
在此代码段中:
stub_request(:any, "localhost:3001")
:any
指的是像GET或者POST一样调用http方法。所以你在 GET/POST/whatever 上存根 URL 并且只在 URL 上存根。我的猜测是您发送请求的目标不完全是 localhost:3001
。
尝试将 Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s
提取到一个变量中,并在您 运行 您的规格时记录它。我的猜测是您需要将存根更改为 URL,这可能类似于 localhost:3001/some_resource/1.
将 localhost:3001
上的所有路径存根
Webmock 还支持通过正则表达式匹配 url:
stub_request(:any, /localhost:3001*/)
我有一个控制器,它有一个 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 我已经指出了to 是 localhost:3001
所以我试过:
stub_request(:any, "localhost:3001")
我在里面使用了它,我的 before 块没有做任何事情,我在实际测试中尝试了它 it 块在我 post :post_review, @params
和 Webmock 似乎什么都不做之前。我认为 webmock 所做的是,它正在侦听对特定 URL 发出的任何请求,并且它 returns 默认成功或您指定的选项块。我不确定我是否正确使用了它。
在此代码段中:
stub_request(:any, "localhost:3001")
:any
指的是像GET或者POST一样调用http方法。所以你在 GET/POST/whatever 上存根 URL 并且只在 URL 上存根。我的猜测是您发送请求的目标不完全是 localhost:3001
。
尝试将 Rails.application.secrets[:platform_receiver_url][:base_url] + response_body["application_id"].to_s
提取到一个变量中,并在您 运行 您的规格时记录它。我的猜测是您需要将存根更改为 URL,这可能类似于 localhost:3001/some_resource/1.
将 localhost:3001
上的所有路径存根Webmock 还支持通过正则表达式匹配 url:
stub_request(:any, /localhost:3001*/)