Guard and Cucumber: когато редактирам дефиниция на стъпка, бих искал да изпълнявам само функции, които изпълняват тази стъпка

Прочетох темата Guardfile за изпълнение на функция за единична краставица в поддиректория? и това работи чудесно: когато променя функция, само тя ще се управлява от guard.

Но в другата посока не работи: когато редактирам който и да е файл с дефиниция на стъпка, винаги всички функции се изпълняват, независимо дали използват някоя от стъпките в стъпката файл с дефиниции или не.

Това не е хубаво. Бих искал поне да се изпълняват само тези функции, които използват някоя от стъпките в редактирания файл; но още по-добре би било, ако guard можеше да види коя стъпка се редактира в момента и след това да изпълнява само функциите, които използват тази конкретна стъпка.

Първото не би трябвало да е толкова трудно за постигане, предполагам; второто изглежда по-скоро пожелателно...


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
Много полезен отговор, благодаря! Предполагам, че ще трябва да поработя още малко с функциите на краставицата и да видя кой е най-добрият начин да разделя стъпките си на отделни файлове, след което ще мога да конфигурирам guard както искам. Най-добри пожелания за теб! - person Joshua Muheim; 06.07.2012