除了一个之外的所有测试之前(:每个)

the*_*lus 10 ruby testing rspec ruby-on-rails capybara

这是我的一部分spec_helper.rb:

RSpec.configure do |config|

 config.before(:each) do
  login(email, password)
  visit root_url
 end

end
Run Code Online (Sandbox Code Playgroud)

我需要的所有(20+)测试除了一个.

有没有办法避免单个测试执行before hook

Joh*_*son 18

您可以向不需要登录的测试添加元数据,然后在before钩子中评估该元数据.

例如,在同一文件中进行两次测试.一个需要登录,一个不需要.

# foo_spec.rb
describe Foo do
  describe "#bar" do
    it "needs to log in" do
      expect(1).to eq 1
    end
  end
  describe "#baz" do
    it "needs to not log in", :logged_out do
      expect(1).to eq 1
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所以我们在it块中添加了元数据.接下来,我们配置before钩子来评估示例的元数据.

config.before(:each) do |test|
  login(email, password) unless test.metadata[:logged_out]
  visit root_url
end
Run Code Online (Sandbox Code Playgroud)

现在,每个测试都会,visit root_url但只有未标记的测试:logged_out才会调用login.

RSpec调用这些基于元数据的钩子过滤器.您可以在这里了解更多相关信息.


Ser*_*sev 5

将这种代码放入规范助手似乎有点奇怪。功能规格是你的全部?没有单元测试?即使是前者,也要将该代码复制到需要它的各个规范中。如果它们都在同一个文件中,您可以使用上下文来防止某些重复。

RSpec.describe 'something' do
  context 'specs with login' do
    before do 
      login(email, password)
      visit root_url
    end

    it { ... }
  end

  context 'specs without login' do
    it { ... }
  end
end
Run Code Online (Sandbox Code Playgroud)

spec_helper.rb 中的全局 rspec 配置用于其他用途。对每个规范都有意义的那些。例如,清理数据库。

config.before :each do 
  DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)