Spork不会重新加载代码

时间:2012-04-24 09:44:51

标签: ruby-on-rails ruby-on-rails-3 rspec spork guard

我正在使用以下宝石和ruby-1.9.3-p194

  • rails 3.2.3

  • rspec-rails 2.9.0

  • spork 1.0.0rc2

  • guard-spork 0.6.1

Gemfile.lockGemfile中提供了已使用宝石的完整列表。

我正在使用此配置文件:

如果我修改任何模型(或app/validators中的自定义验证器等),重新加载代码无效。

我的意思是当我运行规范时(在防守控制台上按Enter键)Spork包含“旧代码”,我收到了过时的错误消息。但是当我手动重启Guard和Spork(CTRC-C CTRL-d后卫)时,一切正常。但是几次之后就累了。

问题:

请有人查看我的配置文件并修复阻止更新代码的错误。

或者这可能是最新Rails版本的问题?


PS此问题在某些项目(以及某些项目)上重复并重复。但我还没弄清楚为什么会发生这种情况。

PS2也许这个问题与ActiveAdmin有关?当我在app/admin中更改文件时,会重新加载代码。

7 个答案:

答案 0 :(得分:8)

解决方法:

# config/environments/test.rb
config.cache_classes = false

但它是“双刃剑”。

规格现在运行〜2.0倍的时间。但它仍然比一次又一次重启Spork更快。


更新28.06.2013

使用Zeus。它完美地运作。基准位于底部..

如果您正在使用1.9.3,请考虑安装特殊补丁,这样可以加快加载应用程序。

RVM patchsets

rbenv instructions

背景&基准:

我有一个非常大的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!]

答案 1 :(得分:7)

或者,您可以为模型,控制器和其他代码添加防护。当任何这些文件发生变化时,它会使警卫重新加载spork。

guard 'spork',
      :rspec_env => {'RAILS_ENV' => 'test'} do
  watch(%r{^app/models/(.+)\.rb$})
  watch(%r{^lib/(.+)\.rb$})
end

答案 2 :(得分:5)

我遇到了同样的问题。重新加载测试并成功运行以更改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-rails替换了spork gem,如上面的@ 23inhouse所述。但是,我没有看到gem文件中的任何一个gem之间有任何区别,尽管升级spork可能会产生影响。

希望这有助于其他人不再花费时间将头撞在墙上。

答案 3 :(得分:4)

与Spork一样好,它似乎在每次Rails升级时都会中断:(

On Rails,3.2.3,我在spec / spec_helper.rb中添加了这个片段,强行重新加载app目录中的所有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

答案 4 :(得分:3)

就我而言,问题很糟糕。它不允许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的陷阱方法。

答案 5 :(得分:2)

Spork得到了清理,并且提供了一些功能。

https://github.com/sporkrb/spork-rails

将此添加到您的Gemfile

gem 'spork-rails'

答案 6 :(得分:0)

通过向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