Spork/Autotest не получает изменения автоматически
Я просто работаю над своим первым приложением rails, следуя инструкциям на http://ruby.railstutorial.org/. Я настроил свою среду разработки в точности так, как сказано в руководстве (я использую Macbook Pro с Lion), и она работает без каких-либо проблем, за исключением одного сбоя. Сначала я пишу неудачные тесты, затем вносю изменения в код, чтобы они прошли, я могу проверить в браузере, что страницы работают правильно, но по какой-то причине результаты теста по-прежнему "красные". У меня есть терминал, работающий с 3 вкладками, первая вкладка, где у меня запущен spork (bundle exec spork), вторая вкладка, где у меня запущен сервер rails (rails s) и третья вкладка, где я делаю все изменения в командной строке и запускаю тесты (автотест || bundle exec rspec spec/). Я должен перезапустить сервер spork, rails, а затем снова протестировать, чтобы увидеть, что они идут "Green".
Это ожидаемое поведение? Потому что, согласно учебникам, в большинстве случаев я должен видеть, что они становятся зелеными, без необходимости перезапускать сервер /spork.
РЕДАКТИРОВАТЬ
Вот как выглядит мой файл spec_helper.rb
require 'rubygems'
require 'spork'
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
# Requires supporting files with custom matchers and macros, etc,
# in ./support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
# == Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, comment the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
end
end
Spork.each_run do
# This code will be run each time you run your specs.
end
Спасибо за совет!
6 ответов
В env.rb (файл, который вы создали spork) у вас есть два блока prefork
а также each_run
, Вот вам объяснение, что они делают:
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
end
а также
Spork.each_run do
# This code will be run each time you run your specs.
end
Я думаю, что это информативно;)
Я только что столкнулся с той же проблемой, когда пытался настроить среду с помощью spork и watchr, и нашел решение (по крайней мере, в моем случае) здесь: http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html
редактировать config/environments/test.rb
+ Изменить
config.cache_classes = true
в
config.cache_classes = false
Это должно заставить spork забирать изменения в ваших контроллерах и моделях без перезапуска.
Редактировать:
С тех пор я столкнулся с проблемами, когда для cache_classes установлено значение false (это вызывало проблемы с машинистом и огурцом - как ни странно, rspec и machinist были в порядке).
В любом случае, кажется, что есть лучшее решение (взято отсюда: http://ablogaboutcode.com/2011/05/18/spork-rspec-sham-and-caching-classes/ и здесь: http://mikbe.tk/2011/02/10/blazingly-fast-tests/), то есть добавить следующий код в ваш блок Spork.each_run
Spork.each_run do
ActiveSupport::Dependencies.clear
ActiveRecord::Base.instantiate_observers
load "#{Rails.root}/config/routes.rb"
Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
end if Spork.using_spork?
Если вы используете spork rc 1.0, вам нужно использовать 'spork-rails'.
Исправлены проблемы с перезагрузкой контроллеров для меня. Благодаря этому посту.
http://blog.firsthand.ca/2012/02/heads-up-use-spork-rails-if-you-want-to.html
Работает ли он, если вы запускаете тест без изменений? Я имею в виду, он "подхватывает" ваши изменения?
Если это так, откройте spec_helper.rb
и изменить each_run
блокировать, чтобы он загружал ваши требования к тестам, которые вам нужны каждый раз, а не только один раз, когда загружается.
Я иду через тот же учебник и столкнулся с той же проблемой. Вот что в итоге сработало для меня:
Обновите файл "spec/spec_helper.rb", чтобы изменить, измените раздел "Spork.prefork" на:
Spork.prefork do # Loading more in this block will cause your tests to run faster. However, # if you change any configuration or code from libraries loaded here, you'll # need to restart spork for it take effect. ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} RSpec.configure do |config| # == Mock Framework # # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: # # config.mock_with :mocha # config.mock_with :flexmock # config.mock_with :rr config.mock_with :rspec config.fixture_path = "#{::Rails.root}/spec/fixtures" # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, comment the following line or assign false # instead of true. config.use_transactional_fixtures = true end end
Обновите файл config / environment / test.rb, чтобы изменить:
config.cache_classes = true
Для того, чтобы:
config.cache_classes = false
Это второй момент, который не упоминается в книге. Я понял это путем перекрестной ссылки на другие вопросы Stackru. В моем случае, перед отключением "config.cache_classes", любые изменения, которые я внесу в контроллер, приведут к запуску набора тестов, но это не будет учитывать изменения. Это может привести к ложным срабатываниям и ложным отрицаниям в зависимости от последнего запуска теста. После отключения настройки тесты забирают мои изменения и, насколько я могу судить, предоставляют действительные индикаторы прохождения / неудачи.
Обратите внимание, что если файл views (.erb) прошел тест один раз, он, похоже, не будет снова выбран, если вы измените его. Однако, если представление не удается, Spork, похоже, продолжает наблюдать за изменениями, пока он не пройдет.
Добавление к ответу Сэма Мирти, в новых версиях Rails устарел instantiate_observers, и удаление этой строки все еще дает желаемый результат:
Spork.each_run do
ActiveSupport::Dependencies.clear
load "#{Rails.root}/config/routes.rb"
Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
end if Spork.using_spork?