Как получить защиту только для запуска медленных спецификаций, если быстрые спецификации пройдут

Я пометил свои спецификации, которые требуют селена с :js => true в моих файлах spec. То, что я хочу достичь, заключается в том, что охрана всегда будет запускать спецификации не :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 и non js, но он всегда будет запускать спецификации js, даже если спецификации не js не работают.

Как я могу предупредить охрану, чтобы не запускать вторую группу, если первая группа не проходит?

Ответ 1

Чтобы немного почистить вещи, поместите это в свой файл .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 в первом наборе, потому что вы, вероятно, захотите, чтобы все быстрые тесты были зелеными, прежде чем даже пытаться медленных (если бы быстрые не были независимыми, вряд ли были бы сломаны и слишком много, чтобы запустить все из них).

Ответ 2

Я считаю, что исправление заключается в объединении обеих групп в одну группу и использовании && между командами. Таким образом, вторая часть команды будет выполняться только в том случае, если первая часть возвращает true:

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

Для получения дополнительной информации о && см. Какова цель "&&" в командной строке?.