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