1

2つのモデルを想定します。

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

および関連する備品:

foos.yml:

one:
  ...

バー.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.インフィクスチャを割り当てる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)に切り替えてください。

于 2012-05-18T23:05:05.087 に答える
0

短いバージョン:activerecordにはIDマップがありません。

長いバージョン:同じデータベース行を2つの場所にロードすると、2つの別々のオブジェクトになります。==と比較すると、それらは同じです(したがって、アクティブレコードはid列を比較するためだけに定義されているため)が、を使用する場合は同じではありませんequal?。(assert_equal使用==前回テスト/ユニットを使用しましたが)。

bar.foos.first.barアソシエーションのオプションを指定できるようなことをしている特定のケースではinverse_of、2つのアソシエーションが互いに反対であることをレールに伝えます。

于 2012-05-19T14:48:30.537 に答える