加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 具有has_many关系的Factory Girl错误

发布时间:2020-12-16 19:18:21 所属栏目:百科 来源:网络整理
导读:我有以下工厂: Factory.define :email do |email| email.email {"infomcburney.cowan.com"}endFactory.define :lead do |lead| lead.emails {|emails| [emails.association(:email)]}end 以下是为以下类建模的 class Lead ActiveRecord::Base has_many :ema
我有以下工厂:
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:
Attribute already defined: emails

我完全坚持这个,任何人都可以指出我正确的方向.我正在使用factory_girl 1.3.2.

解决方法

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

如果你想测试这种关系(我建议你这样做),有一个很棒的宝石叫做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已经为你做的事情.这就是Shoulda的用武之地.

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

class Email < ActiveRecord::Base
  belongs_to :lead
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读