Ruby on rails 除一项测试外,所有测试前(:每个)
这是我的Ruby on rails 除一项测试外,所有测试前(:每个),ruby-on-rails,ruby,testing,rspec,capybara,Ruby On Rails,Ruby,Testing,Rspec,Capybara,这是我的spec\u helper.rb的一部分: RSpec.configure do |config| config.before(:each) do login(email, password) visit root_url end end 这是我在所有(20+)测试中需要的,除了一个 有没有办法避免在hook之前执行的单一测试?将此类代码放入spec helper似乎有点奇怪。功能规格是你所有的吗?没有单元测试?即使是前者,也要将代码复制到需要它的各个规范中。如果它们都
spec\u helper.rb的一部分:
RSpec.configure do |config|
config.before(:each) do
login(email, password)
visit root_url
end
end
这是我在所有(20+)测试中需要的,除了一个
有没有办法避免在hook
之前执行的单一测试?将此类代码放入spec helper似乎有点奇怪。功能规格是你所有的吗?没有单元测试?即使是前者,也要将代码复制到需要它的各个规范中。如果它们都在同一个文件中,您可以使用上下文来防止某些重复
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
spec_helper.rb中的全局rspec配置用于其他用途。对每个规范都有意义的,例如,清理数据库
config.before :each do
DatabaseCleaner.clean
end
不管它是1还是10,都不需要它,遗憾的是,它并没有改变这样一个事实:spec_helper.rb中的任何代码都将应用于所有代码。上面答案中的另一个选项是使用before hook代码创建spec_login.rb文件,然后在需要它的测试文件中需要它
spec/spec_login.rb
spec/1_spec.rb(需要登录)
spec/2_spec.rb(无登录)
您可以将元数据添加到不需要登录的测试中,然后在挂钩之前的中评估该元数据
例如,同一文件中的两个测试。一个需要登录,一个不需要
# 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
因此,我们在it
块中添加了元数据。接下来,我们配置before
hook来评估示例的元数据
config.before(:each) do |test|
login(email, password) unless test.metadata[:logged_out]
visit root_url
end
现在,每个测试都将访问root\u url
,但只有那些没有标记:logged\u out
的测试才会调用login
RSpec调用这些基于元数据的钩子过滤器。您可以进一步了解它们。您还可以在(:each)块之前在spec\u助手的配置中进行检查
基于test.metadata[:descripted\u class]或[:example\u group]
它有大量关于当前上下文的信息,因此从块内部进行过滤可能会更简单一些,而不是单独更改规范。我有很多规范(1_spec.rb、2_spec.rb、3_spec.rb等等),这就是为什么我将登录和访问放在我的spec\u助手中,因为我在所有测试中都需要它们。除了一个…@fabersky:换句话说,你不需要在每个规范中都用到它们?因此,无法使用spec_帮助程序。如果我在spec中的某个不同操作中将放在do
之前,而我不需要登录和访问,rspec会执行spec_帮助程序中的before还是我正在运行的spec中的before?我有22个spec,我需要他们在21个月内them@fabersky:这两个都可以运行。这个带有spec\u login.rb的东西恐怕不行。它进行全局更改(在钩子之前安装全局钩子,该钩子在运行此文件后不会清除)。
describe 'BlahBlah' do
end
# 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
config.before(:each) do |test|
login(email, password) unless test.metadata[:logged_out]
visit root_url
end