factory_girl_rails: ассоциация has_many экземпляра изготовленной на заводе модели не заполняется при создании связанного дочернего элемента - PullRequest
0 голосов
/ 25 июня 2011

Я использую factory_girl_rails вместо приборов. Вот мои модели:

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

Вот соответствующая фабрика:

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

В интеграционном тесте я делаю это:

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 Ответ

1 голос
/ 25 июня 2011

На самом деле, это более вероятно из-за работы ActiveRecord.Ваш контроллер выбирает пользователя из базы данных и создает новый экземпляр пользователя .Теперь ваш контроллер и ваш тест имеют ссылки на двух разных пользователей, поэтому ваш тест никогда не увидит изменений.

Вам нужно будет позвонить reload на user, прежде чем проверять, сколько заданий снова.

Примечание: некоторые ORM предоставляют карту идентификации (специальный тип реестра), чтобы обойти эту проблему (на самом деле ... быстрый Google, похоже, указывает, что Rails 3 недавно добавил карту идентификации, добавленную в источникЯ не использую AR, поэтому не знаю, как вы его включите).

...