【发布时间】:2011-09-16 00:36:19
【问题描述】:
非常简单的规范...
@post.user.should == @user
即使两个对象除了 object_id 外在其他方面都相同,规范也会失败。如果它们的 id 相同,ActiveRecord 对象应该等于 (==)。正在使用 factory_girl 创建对象。我已经确认这两个对象都不是“.new_record?”。比较 @post.user.id 和 @user.id 有效。
更重要的是行为不一致。这些测试正在运行,但现在尽管没有任何变化,但它们仍然失败了。
- Rails 3.1
- rspec-2.6
- factory_girl-2.0.5
- factory_girl_rails-1.1.0
- jruby 1.6.4 (ruby-1.9.2-p136)
- windows7
我通常使用 spork,但不使用 spork 也会发生这种情况。
更多细节:
ActiveRecord::Base 中出现问题的代码行如下
def ==(comparison_object)
super ||
comparison_object.instance_of?(self.class) &&
id.present? &&
comparison_object.id == id
end
具体来说,“instance_of?” check 在不应该的时候失败了。我检查了两个对象的类层次结构。但是,当我检查每个对象的 class.id 时,它们并不相等。
此外,行为取决于我运行的命令...
jruby -S bundle exec rspec spec (FAILS)
jruby -S bundle exec rspec spec\models (PASSES)
jruby -S bundle exec rspec spec\models\post_spec.rb (PASSES)
在我的环境/test.rb 文件中设置 cache_classes=true 似乎可以解决这个问题,但我认为这不是必需的。
【问题讨论】:
-
你在控制台试过这个吗?此外,您是否尝试过使用其他 ruby 虚拟机(例如 MRI)而不是 jruby?
-
我在使用 MRI 时遇到了同样的问题
-
如何使用 FactoryGirl 创建它们?
-
我只使用 FactoryGirl...“user = Factory(:user)”创建用户,在规范顶部的“之前”块内。帖子是用 user.post.build 创建的(在另一个 before 块内)。在 factory.rb 中,我有一个带有我的用户属性的 Factory.define。 (stackoverflow 阻止我在 cmets 的某些地方添加 @)
-
你能发布整个规范吗?也许有一些令人困惑的事情正在发生。
标签: ruby-on-rails ruby rspec factory-bot