По какой-то необъяснимой причине RubyMine автоматически запоминает каждое изменение, которое вы делаете, и поэтому каждый ход ключа запускает Guard для запуска ваших тестов! И самое смешное в том, что, по-видимому, нет возможности отключить эту функцию автосохранения. Мне просто интересно, RubyMine, кажется, очень популярный редактор среди разработчиков Rails, и Guard, похоже, является незаменимым инструментом, используемым для автоматизации тестирования. Поскольку Guard невозможно использовать разумно с RubyMine, как люди справляются с автоматизацией своих тестов с RubyMine?
Невозможно ли использовать Guard с RubyMine?
Ответ 1
Я использую RubyMine с Guard весь день, и на самом деле некоторые части Guard были разработаны в RubyMine.
Вы можете настроить поведение автобезопасности, перейдя в RubyMine > Preferences
в меню и введите sync
в поле поиска, затем выберите System Settings
из списка.
На картинке показаны мои настройки, и все работает нормально. Вы также можете отключить Save files on frame deactivation
, чтобы сохранить файл только вручную.
Я предпочитаю использовать Guard с терминала, но вы можете настроить RubyMine для непосредственного запуска Guard, добавив конфигурацию Run, выбрав Run > Edit configurations
в меню:
Теперь вы можете добавить новую конфигурацию, щелкнув знак плюса +
и выберите IRB console
:
Теперь назовите конфигурацию Guard
, введите путь к Guard в IRB script и установите рабочий каталог проекта. Вы можете ввести аргументы Guard в качестве аргументов IRB, например, различные группы Guard и т.д.
Я нашел свой путь к Guard, открыв терминал, изменив его в рабочий каталог проекта и введя which guard
, что приводит к /Users/michi/.rvm/gems/ruby-1.9.3-p194/bin/guard
для моего SDK Ruby 1.9.3-p194, управляемого RVM.
Затем вам нужно проверить Run script в контексте пакета на вкладке Bundler
.
Теперь нажмите OK
, и у вас есть совершенно новая конфигурация запуска. Перед запуском Guard вы должны настроить интерактивность на простой, добавив
interactor :simple
к вашему Guardfile
. Теперь вы можете запускать (или даже отлаживать) Guard непосредственно в RubyMine:
Наслаждайтесь!
Ответ 2
Когда вы запускаете защиту с помощью RubyMine для тестов, чрезвычайно полезно настроить отдельную среду базы данных для спецификации защиты, иначе вы столкнетесь с необычными проблемами (один процесс или другой зависает или дает непоследовательные результаты.
Назовите свою среду спецификаций защиты "ci" и создайте дополнительную запись в файле database.yml. Я использую "ci" для непрерывной автоматизации.
Затем поместите это в свой файл Guardfile. Главное -
'RAILS_ENV' => 'ci'
Здесь у меня есть моя настройка:
group :spec do
guard :spork, :rspec_port => 1234, :cucumber_env => { 'RAILS_ENV' => 'ci' }, :rspec_env => { 'RAILS_ENV' => 'ci' } do
watch('config/application.rb')
watch('config/environment.rb')
watch(%r{^config/environments/.+.rb$})
watch(%r{^config/initializers/.+.rb$})
watch('spec/spec_helper.rb')
watch(%r{app/models/.+\.rb})
watch(%r{app/views/.+\.haml})
watch('Gemfile')
watch('Gemfile.lock')
watch('test/test_helper.rb')
end
# environment is 'ci'
guard :rspec, :cli => '--drb --drb-port 1234', :version => 2, :all_after_pass => false, :notification => true, :environment => 'ci' 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{^spec/.+_spec.rb$})
watch(%r{^app/(.+).rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^lib/(.+).rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller).rb$}) do |m|
["spec/routing/#{m[1]}_routing_spec.rb",
"spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
"spec/acceptance/#{m[1]}_spec.rb",
"spec/requests/#{m[1]}_spec.rb"]
end
watch(%r{^spec/support/(.+).rb$}) { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
# Capybara request specs
watch(%r{^app/views/(.+)/.*.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
end
end
Затем я запустил
bundle exec guard -g spec
Я также не против того, чтобы RubyMine сохранял файлы автоматически каждые 60 секунд, даже если это срабатывает Guard, так как моя новая MBP Retina не заметно замедляется при запуске Guard.
BTW, характеристики гейн-гейма действительно велики, так как вы найдете неудачные тесты намного быстрее, чем пытаться запускать тесты самостоятельно в RubyMine. I.e., тест в основном делается к тому моменту, когда мой палец освобождается от cmd-s для сохранения.
Я запускаю это из терминала. Я не пробовал работать с RubyMine. Кто-нибудь хочет прокомментировать преимущества этого? Я предполагаю, что щелчок в стеке будет удобным.
Ответ 3
Это очень неприятная проблема, и очень сложно использовать RubyMine с защитой или хрюканьем или другими участниками задач.
Я создал немного сумасшедшего обходного пути, но он достаточно хорошо работает для меня:
- Добавить внешний инструмент для запуска почтенной команды "touch" Unix, которая обновляет измененную метку времени файла, тем самым генерируя событие файловой системы. Он должен выглядеть так:
- Назначьте внешнему инструменту сочетание клавиш.
- Назначьте сочетание клавиш с командой "Сохранить документ".
- Запишите макрос, который запускает "Сохранить документ", а затем "Прикоснитесь" к внешнему инструменту. Вам нужно использовать сочетания клавиш, которые вы назначили, поскольку Save Document не отображается в меню приложения.
- Назначьте Cmd-S в качестве сочетания клавиш для нового макроса.
Мое полное сообщение в блоге об этом в http://singlebrook.com/blog/saving-files-in-rubymine
Ответ 4
Или вы можете добавить файл run_guard.rb в корень вашего проекта со следующим кодом:
exec 'guard'
Остерегайтесь! У Rubymine есть проблемы с вашей PATH. Например, /usr/local/bin фильтруется...