假设有两种模式:
class Foo < ActiveRecord::Base
has_many :bars
end
class Bar < ActiveRecord::Base
belongs_to :foo
end
及其相关的灯具:
foos.yml:
one:
...
bars.yml:
one:
foo: one
two:
foo: one
然后是一个测试用例:
test "fixtures equal?" do
foo = foos(:one)
assert_equal foo, foo.bars.first.foo
end
在单元测试框架和功能测试框架中,此测试都失败了。我得到的失败看起来像:
1) Failure:
test_fixtures_equal?(FooUnitTest) [test/unit/foo_test.rb:53]:
<#<Foo id: 980190962, created_at: "2012-05-18 21:47:27", updated_at: "2012-05-18 21:47:27">>
with id <70029939109360> expected to be equal? to
<#<Foo id: 980190962, created_at: "2012-05-18 21:47:27", updated_at: "2012-05-18 21:47:27">>
with id <70029939309000>.
我做错了什么?如何获得指向相同对象的前向和后向指针?这对我来说特别重要,因为我试图同时修改两个对象并验证更改,但bar.foo链接没有看到“父”foo对象的更改,所以我的验证在测试期间失败。 / p> 唉,经过几个小时的搜索,我尝试了很多不同的方法,但我还是没能把它弄清楚。
谢谢!
答案 0 :(得分:0)
简短回答:
1.(似乎)夹具不理解'参考',它只知道'列名'。
2.在夹具中分配id
有时候并不是一个坏主意
所以,更改你的灯具如下:
# foos.yml
one:
id: 1
# bars.yml
one:
id: 1 # always assign the id
foo_id: 1 # don't use: foo: one
如果您不喜欢灯具,或者您的对象关联很复杂,请切换到'FactoryGirl'(https://github.com/thoughtbot/factory_girl)
答案 1 :(得分:0)
简短版本:activerecord没有身份地图。
长版本:当您在2个位置加载相同的数据库行时,最终会得到2个单独的对象。与==相比,它们是相同的(因为活动记录定义为只比较id列),但在使用equal?
时它们不相同。 (assert_equal
使用==上次我使用了test / unit)。
在您执行bar.foos.first.bar
之类的特定情况下,您可以在关联告诉轨道上指定inverse_of
选项,这两个关联彼此相反。