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:属性はすでに定義されています:emails

私はこれに完全に固執しています、誰かが私を正しい方向に向けることができますか?私はfactory_girl1.3.2を使用しています。

4

2 に答える 2

9

工場にhas_many関係データを追加しないことをお勧めします。この理由は、リードファクトリがこのアソシエーションの作成に依存しているためです。アソシエーションが変更された場合、結合が増え、混乱が生じる可能性があります。

この関係をテストしたい場合(そして私はあなたがそうすることをお勧めします)、関係が正しく設定されていることを確認するためにユニットテストマクロを追加するShouldaと呼ばれる素晴らしい宝石があります。組み込みのRailsTest:: 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の出番です。

私が持っているもう一つのコメントはあなたのEメール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 に答える