Как создать контроль конфигурации Guard, который будет запускать только измененный тестовый файл?

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

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

Спасибо!


person perseverance    schedule 27.02.2013    source источник


Ответы (1)


Плагин Guard 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 предназначен для преобразования имени файла во что-то другое, а параметр black соответствует регулярному выражению, поэтому вы можете добавить к нему некоторую специальную логику. Короткий пример, демонстрирующий это:

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

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

person Netzpirat    schedule 28.02.2013