运行 没有明确指定磁带名称的 VCR 规格
Run Specs With VCR without explicitly specifying the cassette name
我有我想要 运行 的水豚功能规格,但没有明确指定磁带名称。例如:
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
块中,您可以检索每个 运行 规范的详细信息,并在每个规范示例的 运行 之前、前后或之后更改内容。这使我能够拥有一个很好的 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
中了解更多我这样做的原因
我有我想要 运行 的水豚功能规格,但没有明确指定磁带名称。例如:
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
块中,您可以检索每个 运行 规范的详细信息,并在每个规范示例的 运行 之前、前后或之后更改内容。这使我能够拥有一个很好的 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
中了解更多我这样做的原因