2013-02-18 1 views
11

Учитывая следующую конфигурацию RSpec (v2.12.0):Как заставить работать все функции RSpec пренебрегая: фокус тег

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 

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

Есть ли способ, чтобы заставить работать ВСЕХ спецификаций игнорирующих любым тегов с помощью команды Rspec в варианты линии?

ответ

6

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

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

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

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

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

+3

Использование переменных окружения, кажется, как разумное решение, например: 'config.filter_run: фокус => true, если ENV ['CI'] ' – prashantrajan

+0

@prashantrajan Это не сработает для меня. Наши серверы Codeship запускают тесты перед развертыванием в CI. Как и ожидалось, они запускают тесты в ENV ['TEST'] –

9

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

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

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

export FORBID_FOCUSED_SPECS=true 
+0

Мне это нравится, поскольку, в отличие от Rails.env.ci?, Его можно использовать с помощью наших тестовых прогонов Codeship, которые используют тестовую среду. –

+0

Мне нравится эта идея, но я бы предпочел заставить пользователей отказаться от этого поведения (т. Е. «ENV ['ALLOW_FOCUSED_SPECS»]). Таким образом, поведение по умолчанию происходит неудачно, если есть какие-либо сфокусированные спецификации. –

5

Я хотел автоматически терпеть неудачу на нашем сервере непрерывной интеграции, когда внимание было сосредоточено задавать. Это был переписан на основе code из myronmarston для корректной работы с RSpec рельсах 3.2.0:

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

Try: rspec --tag focus --tag ~focus

+0

На первый взгляд это выглядит идеально, но с 'filter_run' это имеет тот же эффект, что и' rspec --tag ~ focus': - сфокусированные спецификации исключены. –