Как заставить запускать все спецификации RSpec, игнорируя: тег фокуса

Учитывая следующую конфигурацию 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

Иногда люди забывают удалить тег :focus из спецификаций и в среде непрерывной интеграции, где мы хотим, чтобы все спецификации запускались, запускаются только спецификации с оставшимся тегом :focus.

Я пробовал:

rspec --tag ~focus

... который запускает все спецификации, исключая те, отмеченные: focus

Есть ли способ заставить run ВСЕ спецификации игнорировать любые теги с помощью параметров командной строки rspec?

Ответ 1

Вы можете удалить строки:

 config.filter_run :focus => true
 config.run_all_when_everything_filtered = true

и попросите пользователей запустить сфокусированные тесты с помощью rspec --tag focus. Таким образом, CI всегда будет запускать полный набор тестов.

Возможно, вы захотите проверить среду в блоке конфигурации и включить/исключить настройку filter_run.

Другая мысль: если вы используете git, установите привязку до фиксации, чтобы в первую очередь не включать спецификации с :focus из базы данных.

Ответ 2

Я просто добавил это в проект:

config.before :focused => true do
  fail "Hey dummy, don't commit focused specs." if ENV['FORBID_FOCUSED_SPECS']
end

И в script, который работает наш сервер непрерывной интеграции:

export FORBID_FOCUSED_SPECS=true

Ответ 3

Попробуйте: rspec --tag focus --tag ~focus

Ответ 4

Я хотел автоматически сбой на нашем сервере непрерывной интеграции, когда был установлен фокус. Это было переписано на основе code из 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']