gpt4 book ai didi

ruby-on-rails - 如何检查在测试期间是否调用了 API

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:45 25 4
gpt4 key购买 nike

我希望我们的应用程序与我们的微服务对话,以便通过 API 发送电子邮件。

在测试中(在 RSpec 中),我想说:

  1. 做某事
  2. 我希望微服务已被调用/未被调用。

例如:

  1. 创建用户
  2. 我希望已发送欢迎电子邮件。

最佳答案

从您的应用程序发送真正的 HTTP 请求可能有一些严重的缺点:

  • 由于连接问题导致测试不稳定。
  • 测试套件速度显着变慢。
  • 在第 3 方网站上达到 API 速率限制
  • 服务可能还不存在(只有它的文档)。
  • 非确定性响应会导致扑动测试。
  • API 可能不提供沙箱或测试模式。

您还需要权衡每个应用程序的明确界限与测试敏锐度。适当遵守应用边界意味着您仅测试您的应用是否按照 API 指定的方式与协作者通信,并剔除实际通信。

缺点当然是在测试敏锐度时 stub 总是有代价的。您可能会错过 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 另一方面是一种中间道路,它可以让您执行真正的 HTTP 请求,并将其记录到 YML 文件中,然后回放结果。随后的运行速度更快且具有确定性。 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

关于ruby-on-rails - 如何检查在测试期间是否调用了 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35467206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com