我正在使用以下宝石和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后卫)时,一切正常。但是几次之后就累了。
问题:
请有人查看我的配置文件并修复阻止更新代码的错误。
或者这可能是最新Rails版本的问题?
PS此问题在某些项目(以及某些项目)上重复并重复。但我还没弄清楚为什么会发生这种情况。
PS2也许这个问题与ActiveAdmin
有关?当我在app/admin
中更改文件时,会重新加载代码。
答案 0 :(得分:8)
解决方法:
# config/environments/test.rb
config.cache_classes = false
但它是“双刃剑”。
规格现在运行〜2.0倍的时间。但它仍然比一次又一次重启Spork更快。
使用Zeus。它完美地运作。基准位于底部..
如果您正在使用1.9.3
,请考虑安装特殊补丁,这样可以加快加载应用程序。
背景&基准:强> 的
我有一个非常大的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