RSpec,Factory_girl和Datamapper的Spork和cache_classes问题 [英] Spork and cache_classes problem with rspec, factory_girl and datamapper
问题描述
Spork测试服务器出现问题.
I've got a problem with Spork test server.
如果我在config/environments/test.rb中将config.cache_classes设置为false,则规范开始出现rasie错误.
If I set config.cache_classes = false in config/environments/test.rb then specs start to rasie errors.
Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar)
DataMapper::ImmutableError:
Immutable resource cannot be modified
这是我的spec_helper.rb:
This is my spec_helper.rb:
require 'spork'
Spork.prefork do
if ENV['CODE_COVERAGE'] == '1'
require 'simplecov'
SimpleCov.start 'rails'
end
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'webmock/rspec'
require 'factory_girl'
Dir[Rails.root.join("spec/controllers/shared/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.mock_with :mocha
config.include Rails.application.routes.url_helpers
config.include UrlHelper
config.before(:each) do
repository(:default) do
transaction = DataMapper::Transaction.new(repository)
transaction.begin
repository.adapter.push_transaction(transaction)
end
end
config.after(:each) do
repository(:default).adapter.pop_transaction.try(:rollback)
end
end
end
# This code will be run each time you run your specs.
Spork.each_run do
# reload factories
Factory.definition_file_paths = Dir[File.join(Rails.root, "spec", "factories")]
Factory.find_definitions
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
LoggedEvent.all.destroy!
end
当config.cache_classes = true时,一切正常,但不会重新加载模型,控制器类,因此在这种情况下使用spork毫无意义.
When I have config.cache_classes = true, then everything works well, but It not reload me a models, controllers classes, so I don't see a point in using spork in this case.
当缓存为true时,我试图向spec_helper.rb添加如下内容:
I tried to add to spec_helper.rb something like this, when cache is true:
Spork.each_run do
Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| load file }
end
但是我不喜欢这种解决方案.
But I don't like this solution.
推荐答案
只需添加:
ActiveSupport::Dependencies.clear
到前叉块的末尾.这将清除模型.
to the end of the prefork block. this will take care of clearing the models.
此外,您还希望将rspec配置包含项移动到Spork.each_run,这与需要规范支持和共享文件相同.
Also, you want to move that rspec configure inclusions to Spork.each_run, same goes with requiring spec support and shared files.
这有效,我在2个项目中使用了此设置,没有任何麻烦.
This works, I use this setup in 2 projects w/o any troubles.
这篇关于RSpec,Factory_girl和Datamapper的Spork和cache_classes问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!