Spork не перезагружает код
Я использую следующие драгоценные камни и ruby-1.9.3-p194
:
рельсы 3.2.3
рспек-рельсы 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
код перезагружен.
7 ответов
Временное решение:
# config/environments/test.rb
config.cache_classes = false
Но это "обоюдоострый меч".
Спецификации теперь работают в ~2.0 раза дольше. Но это все же быстрее, чем перезапускать снова и снова Spork.
Обновление 28.06.2013
Используйте Зевса. Работает отлично. Тесты внизу..
Если вы используете 1.9.3
рассмотреть возможность установки специальных патчей, которые действительно ускоряют загрузку приложения.
Справочная информация и тест:
У меня довольно большой 1.9.3
приложение, и я хотел ускорить загрузку приложения, Spork не работает, поэтому я начал искать другие решения:
Я пишу пустую спецификацию, чтобы увидеть, сколько времени занимает загрузка моего приложения
-/ спецификации /empty_spec.rb
require 'spec_helper'
describe 'Empty' do
end
равнина 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
time rspec spec/empty_spec.rb 17,34s user 2,58s system 99% cpu 20,047 total
1.9.3 + наборы патчей rvm + zeus
time zeus test spec/empty_spec.rb 0,57s user 0,02s system 58% cpu 1,010 total
[w00t w00t!]
Кроме того, вы можете добавить охрану для ваших моделей, контроллеров и другого кода. Это заставит защитную перезагрузку spork при изменении любого из этих файлов.
guard 'spork',
:rspec_env => {'RAILS_ENV' => 'test'} do
watch(%r{^app/models/(.+)\.rb$})
watch(%r{^lib/(.+)\.rb$})
end
У меня такая же проблема. Тесты были перезагружены и успешно выполнены для изменений в 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 на spork-rails, как упоминалось в @23inhouse выше. Однако я не увидел никакой разницы между этими камнями в файле гемов, хотя обновление spork могло оказать влияние.
Надеюсь, это поможет кому-то еще не проводить больше часов, стуча головой о стену.
Великолепно, как Spork, похоже, он ломается при каждом обновлении Rails:(
На Rails, 3.2.3, я добавил этот фрагмент в spec/spec_helper.rb, чтобы принудительно перезагрузить все файлы ruby в каталоге приложения.
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
В моем случае проблема была драпировкой. Это не позволило 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! }
...
Просто не забудьте вставить метод ловушки для Draper перед загрузкой среды.
Spork был очищен, а некоторые функции были добавлены.
https://github.com/sporkrb/spork-rails
добавьте это в ваш Gemfile
gem 'spork-rails'
Исправлена та же проблема, добавляя больше в метод 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