Ruby 如何在rspec中使用不同的before钩子运行相同的规范

Ruby 如何在rspec中使用不同的before钩子运行相同的规范,ruby,unit-testing,rspec,automated-tests,Ruby,Unit Testing,Rspec,Automated Tests,我维护一个从各种API收集数据的gem。对于需要API密钥的API,我已经实现了在未设置API密钥时可以依赖的刮刀 我目前测试scraper和API代码的解决方案是拥有两个几乎相同的spec文件,除了一个before钩子 在API规范中,我有一个before(:each)hook,它显式地设置API键 在scraper规范中,我在(:each)之前有一个钩子,它显式地使API键无效 除了这两个不同的挂钩,规格基本相同。然而,有一两个API规范不同于scraper规范的实例,所以我需要处理这个问题

我维护一个从各种API收集数据的gem。对于需要API密钥的API,我已经实现了在未设置API密钥时可以依赖的刮刀

我目前测试scraper和API代码的解决方案是拥有两个几乎相同的spec文件,除了一个before钩子

在API规范中,我有一个
before(:each)
hook,它显式地设置API键

在scraper规范中,我在(:each)之前有一个钩子,它显式地使API键无效

除了这两个不同的挂钩,规格基本相同。然而,有一两个API规范不同于scraper规范的实例,所以我需要处理这个问题的能力。我想只要检查API键是否设置就足够了

另一件需要注意的事情是,我不想重新运行我的整个测试套件,因为代码库中只有一小部分同时具有API和scraper。我基本上需要能够设置在每个规格的基础上

提前感谢你们提供的任何帮助

编辑:我想我有一个解决方案。将提供详细信息时,我得到一个完整的实施

这就是RSpec的目的。像这样使用:

RSpec.shared_examples_for "an API component" do
  let(:api_client) { APIClient.new }

  it "foos" do
    expect(api_client).to foo
  end

  it "bars" do
    expect(api_client).to bar
  end
end

RSpec.describe API do
  it_behaves_like "an API component" do
    before(:each) { set_api_key }
  end
end

RSpec.describe Scraper do
  it_behaves_like "an API component" do
    before(:each) { nullify_api_key }
  end
end

啊。这比我尝试的方式要优雅得多,我尝试的方式是将规范包装在一个
[nil,'api key]中,每个do | api|u key
块中。我最终会像这样重新格式化它。非常感谢。