RSpec,Factory_girl和Datamapper的Spork和cache_classes问题 [英] Spork and cache_classes problem with rspec, factory_girl and datamapper

查看:93
本文介绍了RSpec,Factory_girl和Datamapper的Spork和cache_classes问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆