2013-02-27 6 views
1

Невозможно было сделать это онлайн, но в моем Guardfile. Я настраиваю watch для различных каталогов/файлов, которые я хочу, чтобы Guard следил за изменениями. Как вы определяете часы для измененных файлов spec/test, которые были обновлены, и только запускать этот конкретный файл, когда это произойдет? Благодаря!Как вы создаете Watch конфигурации Guard, который будет запускать только тестовый файл, который был изменен?

guard 'rspec' do 
    watch(%r|^spec/.+_spec\.rb$|)    { "spec" } 
end 

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

Текущее дерево spec каталога:

spec 
-models 
    -user_spec.rb 
    -classroom_spec.rb 
-controllers 
    -classroom_spec.rb 
-lib 
    -support_spec.rb 

Спасибо!

ответ

3

Гвардия RSpec плагин имеет демо Guardfile, который можно создать с

$ bundle exec guard init rspec 

и содержание следующим образом:

# A sample Guardfile 
# More info at https://github.com/guard/guard#readme 

guard 'rspec' do 
    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)$})     { |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/acceptance/#{m[1]}_spec.rb"] } 
    watch(%r{^spec/support/(.+)\.rb$})     { "spec" } 
    watch('config/routes.rb')       { "spec/routing" } 
    watch('app/controllers/application_controller.rb') { "spec/controllers" } 

    # Capybara features specs 
    watch(%r{^app/views/(.+)/.*\.(erb|haml)$})   { |m| "spec/features/#{m[1]}_spec.rb" } 

    # Turnip features and steps 
    watch(%r{^spec/acceptance/(.+)\.feature$}) 
    watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' } 
end 

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

Чтобы ответить на ваш вопрос, если опустить блок выражения часов, Guard использует точный файл, который имел изменение:

guard 'rspec' do 
    watch(%r|^spec/.+_spec\.rb$|) 
end 

Что бы вызвать плагин RSpec для каждого измененного файла в папке спецификации который заканчивается _spec.rb.

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

watch(%r{^lib/(.+)\.rb$})  { |m| "spec/lib/#{m[1]}_spec.rb" } 

Изменение файла в lib/file.rb будет вызывать плагин и блок преобразует это имя файла spec/lib/file_spec.rb, потому что m[1] содержит группу матча с RegExp, который file.

Смежные вопросы