我希望我们的应用能够与我们的微服务部门通过API发送电子邮件。
在测试中(在RSpec中),我想说:
例如:
答案 0 :(得分:5)
从您的应用发送真实的HTTP请求可能会有一些严重的缺点:
您还需要权衡每个应用程序与测试敏锐度的明确界限。正确尊重应用程序边界意味着您只测试您的应用程序与API指定的协作者进行通信,并将实际通信存根。
当然,骗局在测试敏锐度方面总是有成本。您可能会错过API无法记录的错误或您只是在测试错误的内容。
例如,Webmock 可让您完全删除HTTP层。您可以设置外部调用的期望并模拟返回值。
stub_request(:post, "api.example.com").to_return(status: 201)
expect(a_request(:post, "www.example.com").
with(:body => {"a" => ["b", "c"]},
:headers => {'Content-Type' => 'application/json'})).to have_been_made
另一方面,VCR 是一种中间道路,它允许您执行它记录到YML文件的真实HTTP请求,然后播放结果。后续运行更快且更具确定性。 VCR比设置模拟响应要困难得多,但是您仍然需要处理设置初始状态并清除测试中对外部服务的任何副作用。
VCR.use_cassette("synopsis") do
response = Net::HTTP.get_response(URI('http://example.com'))
expect(response.body).to match("Example domain")
end
这是从使用Flickr API的真实应用程序中提取的示例:
RSpec.feature 'Importing photosets from flickr' do
include JavascriptTestHelpers
let(:user) { create(:admin, flickr_uid: 'xxx') }
before { login_as user }
let(:visit_new_photosets_path) do
VCR.use_cassette('photosets_import') { visit new_photoset_path }
end
scenario 'When I create a photoset it should have the correct attributes', js: true do
visit_new_photosets_path
VCR.use_cassette('create_a_photoset') do
click_button('Create Photoset', match: :first)
wait_for_ajax
end
find('.photoset', match: :first).click
expect(page).to have_content "Showcase"
expect(page).to have_content "Like a greatest hits collection, but with snow."
expect(page).to have_selector '.photo img', count: 10
end
end
答案 1 :(得分:2)
您需要使用message expectations,例如:
it "asks the project to trigger all hooks" do
expect(project).to receive(:execute_hooks).twice
expect(project).to receive(:execute_services).twice
expect(project).to receive(:update_merge_requests)
PostReceive.new.perform(...)
end
关于邮寄商,请查看其他answer