2011-06-25 14 views
0

私は器具の代わりにfactory_girl_railsを使用しています。ここに私のモデルは以下のとおりです。factory_girl_rails:関連付けられた子が作成されたときにファクトリで構築されたモデルインスタンスのhas_many関連が設定されていません

私はこれを行う統合テストで
Factory.define :task do |t| 
    t.association :user 
    t.association :project 
    t.after_create {|t| t.user.tasks << t} 
    t.after_create {|t| t.project.tasks << t} 
end 

class User < ActiveRecord::Base 
    has_many :tasks 
    belongs_to :project 
end 

class Task < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

class Project < ActiveRecord::Base 
    has_many :users 
    has_many :tasks 
end 

はここに関連する工場だ

scenario "user with tasks from one project is assigned another task from the same project" do 
    user = Factory.create :user 
    (1..5).each { Factory.create(:task, :user => user, :project => user.project)} 
    visit_project_path user.project 
    correctly_fill_in_new_task_fields 
    click_button "Create task" #creates a new task for the above user 
    assert user.tasks.size == 6 #currently fails 
end 

私が持っている問題は、シナリオの後に実行されるということですuser.tasks.size == 5でも、Task.where(:user_id => user.id).size == 6である。私はどんな助けにも感謝しています。

答えて

1

実際、これはActiveRecordの仕組みによるものです。コントローラがデータベースからユーザをフェッチし、ユーザの新しいインスタンスを作成します。あなたのコントローラとテストは2人の異なるユーザーを参照するようになりました。そのため、あなたのテストでは変更が見られないのです。

userreloadと電話をかけて、もう何回タスクがあるかを確認する必要があります。

サイドノート:いくつかのORMは、この問題を回避するためのアイデンティティマップ(特別なタイプのレジストリ)を提供しています(実際には、GoogleがRails 3が最近アイデンティティマップをソースに追加したことを示すようです。 ARを使用していないため、どのように有効にしているかわかりません)。

+0

ニースキャッチ、ありがとう。 – James

関連する問題