Guard and Cucumber: когда я редактирую определение шага, я хочу запускать только те функции, которые реализуют этот шаг.

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

Но в другом направлении это не работает: когда я редактирую любой файл определения шага, всегда запускаются все функции, независимо от того, используют ли они какие-либо шаги на шаге. файл определения, или нет.

Это нехорошо. Я бы хотел, чтобы запускались хотя бы те функции, которые используют любой из шагов в отредактированном файле; но еще лучше было бы, если бы охранник мог видеть, какой шаг в настоящее время редактируется, а затем запускал только те функции, которые используют этот конкретный шаг.

Думаю, первое не должно быть таким сложным; второй скорее кажется бесполезным мышлением ...


person Joshua Muheim    schedule 28.06.2012    source источник


Ответы (1)


Чтобы освоить Guard и получить идеальную настройку для ваших проектов и собственных нужд, вам нужно изменить Guardfile и настроить наблюдатели соответственно. Шаблоны, которые поставляются с каждым плагином Guard, стараются соответствовать наиболее полезному поведению для большинства пользователей, которое может отличаться от ваших личных предпочтений.

Каждый плагин Guard начинается с guard метода DSL, за которым следует хэш параметров для настройки плагина Guard. Параметры часто различаются для разных подключаемых модулей Guard, и для получения дополнительной информации необходимо обратиться к подключаемому модулю README.

Между guard блоком do ... end вы обычно настраиваете своих наблюдателей. Наблюдатель должен быть определен с помощью RegExp, описывающего файлы быть под наблюдением. Я использую Rubular для тестирования моих наблюдателей, и вы можете вставить свои текущие функции, скопированные из вывода из find features, чтобы иметь реальные файлы для тестирования ваш RegExp.

Линия

watch(%r{features/.+\.feature})

например, отслеживает все файлы в папке features, которая заканчивается на .feature. Поскольку наблюдателю не предоставляется блок, соответствующий файл передается без изменений в Guard :: Cucumber для запуска.

Наблюдатель

watch(%r{features/support/.+})          { 'features' }

соответствует всем файлам в каталоге features/support, и поскольку блок всегда возвращает features, каждый раз, когда файл в каталоге поддержки изменяется, features передается в Guard :: Cucumber, и, таким образом, все функции выполняются.

Последняя строка

watch(%r{features/step_definitions/(.+)_steps\.rb}) do |m| 
  Dir[File.join("**/#{m[1]}.feature")][0] || 'features'
end

отслеживает каждый файл, который заканчивается на _steps.rb в каталоге features/step_definitions, и пытается сопоставить функцию для определения шага. Обратите внимание на круглые скобки в RegExp features/step_definitions/(.+)_steps\.rb. Это определяет группу соответствия, которая будет доступна позже в вашем блоке наблюдателя. Например, определение шага features/step_definitions/user_steps.rb будет соответствовать, а первая группа совпадений (m[1]) будет содержать значение user.

Теперь мы пытаемся найти подходящее файл во всех подкаталогах (**) с именем user.feature. В этом случае запустите первый соответствующий файл ([0]) или, если вы ничего не нашли, запустите все features.

Похоже, вы назвали свои шаги иначе, чем ожидает Guard :: Cucucmber Guardfile по умолчанию, и это совершенно нормально. Просто измените наблюдателя в соответствии с вашим соглашением об именах.

person Netzpirat    schedule 28.06.2012
comment
Очень полезный ответ, спасибо! Думаю, мне придется немного поработать с функциями огурца и посмотреть, как лучше всего разделить мои шаги на отдельные файлы, тогда я смогу настроить охрану так, как я хочу. Желаю тебе всего наилучшего! - person Joshua Muheim; 06.07.2012