与has_many关系的Factory Girl错误

我有以下工厂:

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  "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。

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

如果你想测试这种关系(我建议你这样做),有一个名为Shoulda的伟大的gem,它增加了unit testing宏,以确保关系设置正确。 我没有使用内置的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已经为你做的事情。 这就是Shoulda的用武之地。

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

 class Email < ActiveRecord::Base belongs_to :lead end 

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

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