Ошибка Factory Girl с отношением has_many - PullRequest
8 голосов
/ 29 октября 2010

У меня есть следующие фабрики:

Factory.define :email do |email|
  email.email {"infomcburney.cowan.com"}
end

Factory.define :lead do |lead|
  lead.emails {|emails| [emails.association(:email)]}
end

, которые моделируют следующие классы

class Lead < ActiveRecord::Base
  has_many :emails
end

class Email < ActiveRecord::Base
  belongs_to :lead, :class_name => "Lead", :foreign_key => "lead_id"
end

Когда я запускаю этот тест через musta:

    should "capture emails" do
      lead = Factory.build(:lead)
      assert_equal(1, lead.emails.size)
    end

Я получаю следующую ошибку:

Factory :: AttributeDefinitionError: Атрибут уже определен: электронные письма

Я полностью застрял в этом, может кто-нибудь указать мне правильное направление,Я использую factory_girl 1.3.2.

Ответы [ 2 ]

9 голосов
/ 29 октября 2010

Я бы не советовал добавлять данные отношений has_many на ваши фабрики.Причина этого заключается в том, что ваша ведущая фабрика теперь зависит от заполнения этой ассоциации, и она добавляет больше связи и, возможно, некоторую путаницу в будущем, если связь изменится.

Если вы хотите проверить эту связь (и я рекомендуюdo), есть замечательный гем под названием Shoulda , который добавляет макросы модульного тестирования, чтобы убедиться, что отношения установлены правильно.Я не использовал его со встроенным Rails Test :: Unit, но пример RSpec выглядел бы примерно так:

describe Lead do
  it { should have_many(:emails) }
end

Если вы действительно хотите проверить это отношение, вы должны сделать это в спецификации,Удалите ассоциацию электронной почты из вашей ведущей фабрики и создайте ведущий объект и попробуйте передать ему несколько объектов электронной почты, например, так:

lead = Factory.build(:lead)
2.times do { lead.emails << Factory.build(:email, :lead => lead) }

Тогда у него должна быть пара электронных писем с ним.Тем не менее, вы должны поверить в ActiveRecord и просто протестировать то, что выходит за рамки того, что Rails уже делает для вас.Это то место, где следует Приходить.

Еще один комментарий, который у меня есть, находится на вашем E-mail.Поскольку вы просто используете соглашения по умолчанию, rails будет знать, что делать.

class Email < ActiveRecord::Base
  belongs_to :lead
end
3 голосов
/ 25 июня 2012

Это интересная статья, которая может быть полезна:

http://icelab.com.au/articles/factorygirl-and-has-many-associations/

    FactoryGirl.define do
      factory :venue_with_gigs, :parent => :venue do
        after_create do |venue|
          FactoryGirl.create(:gig, :venue => venue)
        end
      end
    end
...