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

时间:2016-03-13 02:25:13

标签: ruby unit-testing rspec automated-tests

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

我当前测试刮刀和API代码的解决方案是有两个规格文件几乎相同,除了之前的钩子。

在API规范中,我有一个显式设置API密钥的before(:each)挂钩。

在scraper规范中,我有一个before(:each)挂钩,它明确地使API密钥无效。

除了这两个不同的钩子,规格基本相同。但是,有一个或两个实例,API规范与刮刀规范不同,所以我需要能够处理它。我想只是检查是否设置了API密钥就足够了。

另外需要注意的是,我不想重新运行我的整个测试套件,因为只有很小一部分代码库都有API和刮刀。我基本上需要能够按照规格进行设置。

提前感谢您提供的任何帮助!

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

1 个答案:

答案 0 :(得分:3)

这是RSpec的shared examples所针对的。像这样使用:

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