Spork не перезагружает код
Я использую следующие камни и ruby-1.9.3-p194
:
-
rails 3.2.3
-
rspec-rails 2.9.0
-
spork 1.0.0rc2
-
guard-spork 0.6.1
Полный список используемых драгоценных камней можно найти в этом Gemfile.lock или Gemfile.
И я использую эти файлы конфигурации:
Если я изменяю какую-либо модель (или пользовательский валидатор в app/validators
и т.д.), перезагружающий код не работает.
Я имею в виду, когда я запускаю спецификации (нажмите Enter на защитной консоли) Spork содержит "старый код", и я получил устаревшие сообщения об ошибках. Но когда я вручную перезапускаю Guard и Spork (CTRC-C CTRL-d guard), все работает нормально. Но через несколько раз он устает.
Вопросы:
Может кто-нибудь посмотреть на мои файлы конфигурации, пожалуйста, и исправить ошибку, которая блокирует обновление кода.
Или, может быть, это проблема с новой версией Rails?
PS Эта проблема повторяется и повторяется над некоторыми проектами (и некоторыми НЕ). Но я еще не понял, почему это происходит.
PS2 Возможно, эта проблема связана с ActiveAdmin
? Когда я меняю файл в app/admin
, код перезагружается.
Ответы
Ответ 1
Обход проблемы:
# config/environments/test.rb
config.cache_classes = false
Но это "обоюдоострый меч".
Спекуляция выполняется в ~ 2.0 раза. Но он все же быстрее, чем перезапуск снова и снова Spork.
Обновление 28.06.2013
Используйте Zeus. Он работает отлично. Тесты находятся внизу.
Если вы используете 1.9.3
, подумайте об установке специальных патчей, которые ДЕЙСТВИТЕЛЬНО ускорят загрузку приложения.
Патчи RVM
инструкции rbenv
Фон и контрольный показатель:
У меня довольно большое приложение 1.9.3
, и я хотел ускорить загрузку приложения, Spork не работает, поэтому я начал искать другие решения:
Я пишу пустую спецификацию, чтобы узнать, сколько времени требуется для загрузки моего приложения.
-/спецификации/empty_spec.rb
require 'spec_helper'
describe 'Empty' do
end
plain 1.9.3
time rspec spec/empty_spec.rb 64,65s user 2,16s system 98% cpu 1:07,55 total
1.9.3 + rvm patchsets
time rspec spec/empty_spec.rb 17,34s user 2,58s system 99% cpu 20,047 total
1.9.3 + rvm patchsets + zeus
time zeus test spec/empty_spec.rb 0,57s user 0,02s system 58% cpu 1,010 total
[w00t w00t!]
Ответ 2
В качестве альтернативы вы можете добавить стражи для своих моделей, контроллеров и другого кода. Это приведет к перезагрузке справки, когда любой из этих файлов изменится.
guard 'spork',
:rspec_env => {'RAILS_ENV' => 'test'} do
watch(%r{^app/models/(.+)\.rb$})
watch(%r{^lib/(.+)\.rb$})
end
Ответ 3
У меня была та же проблема. Тесты были перезагружены и успешно запущены для изменений в model_spec.rb. Когда я внес изменения в файл model.rb, тесты были повторно запущены, однако код, казалось, был кэширован - поэтому изменения не были применены.
Это потребовало комбинации нескольких ответов, чтобы заставить все работать:
# /config/environments/test.rb
config.cache_classes = !(ENV['DRB'] == 'true')
# spec_helper.rb
Spork.each_run do
.....
ActiveSupport::Dependencies.clear
end
Я также обновил spork до (1.0.0rc3) и заменил spork gem на spork-rails, как уже упоминалось выше в 233. Тем не менее, я не видел никакой разницы между камнем в gemfile, хотя обновление spork могло иметь эффект.
Надеюсь, это поможет кому-то еще не тратить больше часов, ударяя головой о стену.
Ответ 4
Отлично, как Spork, он, кажется, разбивается на каждое обновление Rails: (
В Rails, 3.2.3, я добавил этот фрагмент в spec/spec_helper.rb, чтобы принудительно перезагрузить все рубиновые файлы в каталоге приложения.
Spork.each_run do
# This code will be run each time you run your specs.
Dir[Rails.root + "app/**/*.rb"].each do |file|
load file
end
end
Ответ 5
В моем случае проблема была сложной. Это не позволяло spork перезагружать модели.
Spork.prefork do
ENV['RAILS_ENV'] ||= 'test'
# Routes and app/ classes reload
require 'rails/application'
Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
Spork.trap_method(Rails::Application, :eager_load!)
# Draper preload of models
require 'draper'
Spork.trap_class_method(Draper::System, :load_app_local_decorators)
# Load railties
require File.expand_path('../../config/environment', __FILE__)
Rails.application.railties.all { |r| r.eager_load! }
...
Не забудьте вставить метод trap для Draper перед загрузкой среды.
Ответ 6
Spork был очищен, а некоторые функции были добавлены.
https://github.com/sporkrb/spork-rails
добавьте это в свой Gemfile
gem 'spork-rails'
Ответ 7
Исправлена та же проблема, добавляя больше к методу spork.each_run.
Rails 3.2.2
Кроме того, я рекомендую запустить один тест за раз. Это намного быстрее, менее шумно, и мы обычно работаем над одним тестом в любой момент.
rspec spec -e 'shows answer text'
Я считаю, что это быстрее и легче, чем использование Guard, потому что я просто сидел, ожидая, когда Guard закончит. Кроме того, Guard не всегда загружал правильные файлы и запускал правильные тесты, когда я вносил изменения.
файл spec_helper.rb:
require 'spork'
Spork.prefork do
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'
require 'capybara/rails'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
end
Spork.each_run do
Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f}
RSpec.configure do |config|
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
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, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
config.include RequestHelpers, :type => :request
config.before :suite do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with :truncation
end
config.before :each do
DatabaseCleaner.start
end
config.after :each do
DatabaseCleaner.clean
end
config.include(MailerHelpers)
config.before(:each) { reset_email }
end
# This code will be run each time you run your specs.
end