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 рассмотреть возможность установки специальных патчей, которые действительно ускоряют загрузку приложения.

RVM патчи

инструкции rbenv

Справочная информация и тест:

У меня довольно большой 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
Другие вопросы по тегам