【问题标题】:Rack::Test resulting in ActiveRecord::AssociationTypeMismatchRack::Test 导致 ActiveRecord::AssociationTypeMismatch
【发布时间】:2011-04-01 22:13:33
【问题描述】:

我在运行所有规范时遇到问题。

ActiveRecord::AssociationType 不匹配: Affiliate(#2154746360) 预期,得到 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 加载,然后在我的“应用程序”方法中调用 Rails.application 时重新定义它们。

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

【问题讨论】:

  • 我们遇到了完全相同的问题,但未能成功解决。你有运气吗?
  • 在这个问题上,factory_girl Google Group 似乎有一些行动:groups.google.com/group/factory_girl/browse_thread/thread/…
  • 迈克尔,到目前为止我还没有运气。我刚刚避免使用我的其他规范运行有问题的规范。这是一种痛苦。
  • 我确实最终解决了这个问题,但我不知道重构中的哪些变化起到了作用。我认为问题可能是我的 Rspec 配置块在 Spork 的 prefork 之外,但这并不适合我。如果它有帮助,我可以检查我的更改并尝试找出实际修复它的内容。

标签: ruby-on-rails rspec spork


【解决方案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 被标记为已弃用。

【讨论】:

  • 谢谢,但在更新我的 gems 之后,事情似乎已经解决了。
【解决方案2】:

我不再有这个问题了。我更新了我的宝石。 Rails 从 3.0.5 更新到 3.0.7,我猜这可能是解决我问题的 gem 更新。无论使用较新版本的 gem,我的问题都已解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多