在Rspec中运行嵌套标签

时间:2017-09-15 18:45:27

标签: ruby rspec

我正在尝试以这种方式构建我的测试,以便我可以自己运行某些上下文块,但还需要在单独的块中进一步强制执行嵌套标记。像这样:

context 'outer context', :outer_tag do
    it 'inner it', :tag1 do
        expect(1).to eq(1)
    end

    it 'inner it 2', :tag2 do
        expect(2).to eq(2)
    end
end

我希望按照以下方式运行:

rspec --tag outer-tag --tag tag1

希望它只在标记为:outer-tag的上下文中运行测试,这些标记本身标记为:tag1

有没有办法解决这个问题?目前这似乎是作为'或'运作,当我想我正在寻找它作为更多的'和'。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以这样做:

RSpec.describe 'Something' do
  context 'outer context', :outer_tag do
    it 'inner one', :tag1, outer_tag: 'tag1' do
      expect(1).to eq(1)
    end

    it 'inner two', :tag2, outer_tag: 'tag2' do
      expect(2).to eq(2)
    end
  end

  context 'another context', :different_tag do
    it 'inner three', :tag2, different_tag: 'tag2' do
      expect(3).to eq(3)
    end
  end
end

然后运行:

rspec example.rb --tag 'outer_tag'
# => Something
#      outer context
#        inner one
#        inner two
rspec example.rb --tag 'outer_tag:tag2'
# => Something
#      outer context
#        inner two
rspec example.rb --tag tag2
# => Something
#      outer context
#        inner two
#      another context
#        inner three

当你需要多个级别时,这开始变得奇怪:

context 'third context', :final_tag do
  context 'inside third', :inner_third, final_tag: 'inner_third' do
    it 'inner four', :inner_four,  inner_third: 'inner_four', final_tag: 'inner_third:inner_four' do
      expect(4).to eq(4)
    end
  end
end

rspec example.rb --tag 'final_tag:inner_third:inner_four'
rspec example.rb --tag 'inner_third:inner_four'
rspec example.rb --tag inner_four
# All run
# => Something
#      third context
#        inside third
#          inner four

工作,但非常冗长。

由于rspec在命令行上处理标签的方式(哈希),它可能会导致一些意想不到的东西试图将它们组合起来:

rspec example.rb --tag outer_tag --tag ~'outer_tag:tag2'
# Run options: exclude {:outer_tag=>"tag2"}
# => Something
#      outer context
#        inner one
#      another context             # <- nothing in this context was expected to run
#        inner three (FAILED - 1)

这种方式有效:

rspec example.rb --tag outer_tag --tag ~tag2
# => Something
#      outer context
#        inner one

答案 1 :(得分:1)

你也可以使用RSpec&#39; exclusion filter运行所有:outer_tag测试,但具有:tag1规范的测试除外。

RSpec.configure do |config|
  config.filter_run :outer_tag
  config.filter_run_excluding :tag1
end

仅运行:tag2的测试:

> rspec -fd tag_spec.rb
Run options:
  include {:outer_tag=>true}
  exclude {:tag1=>true}

outer context
  inner it 2

Finished in 0.00326 seconds (files took 1.07 seconds to load)
1 example, 0 failures

您可以使用环境变量,以便不将代码修改为仅运行测试的子集。