ruby-on-rails - 使用 VCR 运行规范,无需明确指定磁带名称

标签 ruby-on-rails ruby rspec capybara vcr

我有 capybara 功能规范,打算在不明确指定磁带名称的情况下运行。例如:

  scenario "by searching via a title" do
    visit root_path

    fill_in "search", with: "cheddar"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddar/)
  end
  scenario "by searching via a description" do
    visit root_path

    fill_in "search", with: "cheddar"
    select "Description", from: "search_field"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddars Are Scarce/)
  end

这些规范中的每一个都适用于第三方 API。我想为每个规范使用不同的磁带名称,而不必显式使用 VCR.use_cassette。我希望我的功能规范足够清晰和简洁,只关注用户的操作。有没有办法实现这个目标?

最佳答案

我过去处理类似问题的方法是从rails_helper 文件中进行配置。

在您的 Rspec.configure block 中,您可以检索每个正在运行的规范的详细信息,并在每个规范示例运行之前、前后或之后进行更改。这使我能够拥有一个很好的 DSL,它允许我将磁带名称指定为 vcr 标签。因此,就您而言,它可以变成:

  scenario "by searching via a title", vcr: :search_title do
    visit root_path

    fill_in "search", with: "cheddar"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddar/)
  end
  scenario "by searching via a description", vcr: :search_description do
    visit root_path

    fill_in "search", with: "cheddar"
    select "Description", from: "search_field"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddars Are Scarce/)
  end

为了使这项工作正常进行,我必须在rails_helper 文件中进行更改:

RSpec.configure do |c|
  c.around(:each, :vcr) do |example|
    name = Array(example.metadata.dig(:vcr)).join
    options = example.metadata.slice(:record, :match_requests_on)
    VCR.use_cassette(name, options) { example.call }
  end
end

对于带有 vcr 标签的每个规范示例,获取规范的元数据并检索存储在 vcr 标签中的任何内容作为磁带名称。其余行仅针对具有 VCR 标签的规范激活 VCR。你可以从这个railscast episode中更多地了解我这样做的原因。

关于ruby-on-rails - 使用 VCR 运行规范,无需明确指定磁带名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858071/

相关文章:

ruby-on-rails - 我是否需要在 Rails 迁移中显式创建 ID?

ruby-on-rails - unicorn 重启错误

ruby-on-rails - 使用 Rails 3 Hook gem 以在 Rack 堆栈上添加中间件

ruby-on-rails - 如何重命名哈希参数中的符号?

ruby - 在字符串中查找正则表达式匹配的索引

ruby-on-rails - `after_commit` 上的 `update` 回调未触发

ruby-on-rails - 使用 RSpec 创建 gem 的好教程是什么?

ruby-on-rails - 如何在可能的情况下进行地理编码并使用 gmaps4rails 跳过错误?

Ruby 字符串 to_f... 错误?

ruby-on-rails - capybara, rspec - 地址已在使用 - bind(2) for 127.0.0.1 :3000