1

假设有两个模型:

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

及其相关的固定装置:

foos.yml:

one:
  ...

bar.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 对象的更改,因此我的验证在测试期间失败。

唉,在搜索了几个小时后,我尝试了许多不同的方法,但我无法弄清楚这一点。

谢谢!

4

2 回答 2

0

简短回答:
1.(似乎)夹具不理解“参考”,它只知道“列名”。2. 分配idin 夹具有时不是一个坏主意

所以,改变你的装置如下:

# 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

于 2012-05-18T23:05:05.087 回答
0

简短版本:activerecord 没有身份映射。

长版:当您在 2 个地方加载相同的数据库行时,您最终会得到 2 个单独的对象。与 == 比较时,它们是相同的(因为活动记录因此定义为仅比较 id 列),但在使用equal?. (assert_equal虽然使用 == 我上次使用测试/单元)。

在特定情况下,您bar.foos.first.bar可以在关联上指定inverse_of选项告诉 Rails 2 个关联彼此相反。

于 2012-05-19T14:48:30.537 回答