如何强制运行所有RSpec规范忽略:焦点标记

pra*_*jan 12 rspec rspec2

给定以下RSpec配置(v2.12.0):

RSpec.configure do |config|
 config.treat_symbols_as_metadata_keys_with_true_values = true
 config.filter_run :focus => true
 config.run_all_when_everything_filtered = true
end
Run Code Online (Sandbox Code Playgroud)

有时人们忘记:focus从规范中删除标记,并且在我们希望运行所有规范的持续集成环境中,只运行带有剩余:focus标记的规范.

我试过了:

rspec --tag ~focus
Run Code Online (Sandbox Code Playgroud)

...运行所有规格,不包括那些标记为:焦点

有没有办法强制运行所有规格忽略任何标签使用rspec的命令行选项?

小智 11

我刚把它添加到一个项目中:

config.before :focused => true do
  fail "Hey dummy, don't commit focused specs." if ENV['FORBID_FOCUSED_SPECS']
end
Run Code Online (Sandbox Code Playgroud)

在我们的持续集成服务器运行的脚本中:

export FORBID_FOCUSED_SPECS=true
Run Code Online (Sandbox Code Playgroud)


zet*_*tic 8

你可以删除这些行:

 config.filter_run :focus => true
 config.run_all_when_everything_filtered = true
Run Code Online (Sandbox Code Playgroud)

并告诉用户运行重点测试rspec --tag focus.这样,CI将始终运行完整的测试套件.

您可以考虑检查配置块中的环境并filter_run适当地包括/排除设置.

另一个想法:如果你正在使用git,设置一个预提交钩子,以防止规范首先:focus爬进代码库.

  • 使用环境变量似乎是一个明智的解决方案,例如:`config.filter_run:focus => true,除非ENV ['CI']` (3认同)

Dan*_*ohn 8

我想在设置焦点时自动在我们的持续集成服务器上失败.这是根据myronmarston的代码重写,以便与rspec-rails 3.2.0一起正常工作:

  config.before(:example, :focus) do
    fail 'This example was committed with `:focus` and should not have been'
  end if ENV['CI']
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 5

尝试: rspec --tag focus --tag ~focus

  • 乍一看,这看起来很完美,但是使用 `filter_run` 时,这与 `rspec --tag ~focus` 具有相同的效果:- 不包括重点规范。 (2认同)