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

Erw*_*inM 11 testing rspec ruby-on-rails guard rspec2

:js => true在我的spec文件中标记了我的规格需要selenium .我想要实现的是,后卫将始终首先运行非: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
Run Code Online (Sandbox Code Playgroud)

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

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

Cez*_*ski 6

要清除了一点东西,把这个在您的.rspec.rspec-local文件:

--color
--format nested
--fail-fast
Run Code Online (Sandbox Code Playgroud)

解决方案:使用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
Run Code Online (Sandbox Code Playgroud)

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

哦,我认为你想:all_after_pass => true在第一组中 - 因为你可能希望所有的快速测试都是绿色的,甚至在尝试慢速测试之前(除非快速测试是独立的,不太可能被打破并且太多而无法运行全部他们).


Dan*_*ohn 0

我相信解决方法是将两个组合并为一个组并&&在命令之间使用。这样,只有第一部分返回 true 时,命令的第二部分才会运行:

cmd: `zeus rspec --color --format nested --fail-fast -t ~js && zeus rspec --color --format nested --fail-fast -t js`
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请&&参阅shell 命令中“&&”的用途是什么?