Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 除一项测试外,所有测试前(:每个)_Ruby On Rails_Ruby_Testing_Rspec_Capybara - Fatal编程技术网

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