8

我有以下工厂:

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

当我通过 shoulda 运行这个测试时:

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

我收到以下错误:

Factory::AttributeDefinitionError:属性已定义:电子邮件

我完全坚持这一点,谁能指出我正确的方向。我正在使用 factory_girl 1.3.2。

4

2 回答 2

9

我建议不要将 has_many 关系数据添加到您的工厂。这样做的原因是,您的主导工厂现在依赖于填充此关联,并且如果关联发生更改,它会增加更多的耦合并可能会造成一些混乱。

如果你想测试这种关系(我建议你这样做),有一个很棒的 gem,叫做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 已经为您做的事情之外的事情。这就是应该派上用场的地方。

我的另一条评论是关于您的电子邮件 belongs_to 关系。由于您只是使用默认约定,因此 rails 会知道该怎么做。

class Email < ActiveRecord::Base
  belongs_to :lead
end
于 2010-10-29T00:03:20.600 回答
3

这是一篇有趣的文章,可能会有所帮助:

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
于 2012-06-25T14:38:11.110 回答