Rack :: Test导致ActiveRecord :: AssociationTypeMismatch

时间:2011-04-01 22:13:33

标签: ruby-on-rails rspec spork

运行我的所有规格时遇到问题。

    ActiveRecord::AssociationTypeMismatch:
       Affiliate(#2154746360) expected, got Affiliate(#2199508660)

似乎我的模型被加载了两次。

我已经通过Rack :: Test要求定义“app”方法来解决问题。

require 'rack/test'
include Rack::Test::Methods

# app method is needed for rack-test
def app
  Rails.application
end

如果我评论Rails.application我的机架规格不起作用,但我的所有其他规格都可以正常工作。在“app”方法中使用Rails.application会引入上述错误。

如果我单独运行我的规格,一切正常。我正在使用Spork预加载我的环境,我认为模型首先由Spork加载,然后在我的“app”方法中调用Rails.application时重新定义它们。

有关如何解决此问题的任何想法?我不确定是否有另一种方法可以在“app”方法中设置我的Rails应用程序。

2 个答案:

答案 0 :(得分:1)

Rails.application的源代码:

# File railties/lib/rails.rb, line 34
def application
  @@application ||= nil
end

这意味着Rails.application每次都返回相同的对象。也许这就是问题 - 在相同的Rails应用程序上运行多个测试与对象冲突。

Some tutorials设置如下测试:

def app
  Rails::Application
end

others这样做:

def app
  ActionController::Dispatcher.new
end

两者都为app的每次调用创建新对象。

编辑:从日志中注意到ActionController::Dispatcher.new被标记为已弃用。

答案 1 :(得分:0)

我不再有这个问题了。我更新了我的宝石。 Rails从3.0.5更新到3.0.7,我猜可能是修复我的问题的gem更新。无论哪种方式使用更新版本的宝石,我的问题都是固定的。