如果快速规格通过,如何防范只运行慢速规格

时间:2014-01-12 11:08:28

标签: ruby-on-rails testing rspec rspec2 guard

我已在我的规范文件中标记了我的规格要求使用:js => true的硒。我想要实现的是,警卫将始终首先运行非:js规范,仅在这些规范全部通过时运行标记为:js的规范。

这是我目前的Guardfile

group 'non-javascript specs' do
  guard 'rspec', cmd: 'zeus rspec --color --format nested --fail-fast -t ~js', parallel: false,    bundler: false, :all_on_start => false, :all_after_pass => false, :keep_failed => false do
    notification :terminal_notifier

    watch(%r{^spec/.+_spec\.rb$})
    watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
    watch('spec/spec_helper.rb')  { "spec" }

    # Rails example
    watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
    watch(%r{^app/(.*)(\.erb|\.haml|\.jbuilder)$})      { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
    watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/features/#{m[1]}_spec.rb"] }
    watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
    watch('config/routes.rb')                           { "spec/routing" }
    watch('app/controllers/application_controller.rb')  { "spec/controllers" }

    watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/features/#{m[1]}_spec.rb" }
   end
 end

group 'javascript specs' do
  guard 'rspec', cmd: 'zeus rspec --color --format nested --fail-fast -t js', parallel: false, bundler: false, :all_on_start => false, :all_after_pass => false, :keep_failed => false do
    notification :terminal_notifier
    watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
    watch(%r{^spec/requests/.+_spec\.rb$})
    watch(%r{^spec/features/.+_spec\.rb$})
  end
end

但是,使用此配置,它将分割js和非js规范的执行,但即使非js规范,也会始终运行js规范失败。

如果第一组未通过,我如何告诉警卫不要运行第二组?

2 个答案:

答案 0 :(得分:6)

要清理一下,请将其放在.rspec.rspec-local文件中:

--color
--format nested
--fail-fast

解决方案:使用halt_on_fail停止第一个组项失败:

group 'specs', halt_on_fail: true do
  js_opts = { parallel: false, bundler: false, :all_on_start => false, :all_after_pass => false, :keep_failed => false }

  guard 'rspec', js_opts.merge(cmd: 'zeus rspec -t ~js'),  do
   # (...)
  end

  guard 'rspec', js_opts.merge(cmd: 'zeus rspec -t js'),  do
   # (...)
  end
end

这应该按预期工作。如果没有在https://github.com/guard/guard中提交错误问题。

哦,我认为你在第一组中需要:all_after_pass => true - 因为你可能希望所有的快速测试在尝试慢速测试之前都是绿色的(除非快速测试是独立的,不太可能是破碎,太多,无法运行所有这些)。

答案 1 :(得分:0)

我认为修复是将两个组合并为一个组,并在命令之间使用&&。这样,只有当第一部分返回true时,命令的第二部分才会运行:

cmd: `zeus rspec --color --format nested --fail-fast -t ~js && zeus rspec --color --format nested --fail-fast -t js`

有关&&的更多信息,请参阅What is the purpose of "&&" in a shell command?