1. ホーム
  2. rspec

[解決済み] FactoryBotでhas_manyアソシエーションを使用してファクトリーをセットアップする方法

2023-02-18 10:01:32

質問

私が間違った方法でセットアップしているのかどうか、誰か教えてください。

私はhas_many.throughの関連付けを持っている以下のモデルを持っています。

class Listing < ActiveRecord::Base
  attr_accessible ... 

  has_many :listing_features
  has_many :features, :through => :listing_features

  validates_presence_of ...
  ...  
end


class Feature < ActiveRecord::Base
  attr_accessible ...

  validates_presence_of ...
  validates_uniqueness_of ...

  has_many :listing_features
  has_many :listings, :through => :listing_features
end


class ListingFeature < ActiveRecord::Base
  attr_accessible :feature_id, :listing_id

  belongs_to :feature  
  belongs_to :listing
end

Rails 3.1.rc4, FactoryGirl 2.0.2, factory_girl_rails 1.1.0, rspecを使用しています。 以下は、私の基本的なrspecのサニティチェックです。 :listing ファクトリーのサニーチェックです。

it "creates a valid listing from factory" do
  Factory(:listing).should be_valid
end

以下はFactory(:listing)です。

FactoryGirl.define do
  factory :listing do
    headline    'headline'
    home_desc   'this is the home description'
    association :user, :factory => :user
    association :layout, :factory => :layout
    association :features, :factory => :feature
  end
end

:listing_feature:feature ファクトリーも同様に設定されます。

もし association :features の行がコメントアウトされていれば、私のテストはすべてパスします。

であるとき

association :features, :factory => :feature

エラーメッセージは undefined method 'each' for #<Feature> というもので、私は意味があると思っていたのですが、なぜなら listing.features は配列を返すからです。 そこで、私はこれを

association :features, [:factory => :feature]

というエラーが表示されます。 ArgumentError: Not registered: features この方法でファクトリーオブジェクトを生成することは、単に賢明ではないのでしょうか、それとも何か見逃しているのでしょうか? どんな意見でも本当にありがとうございます。

どのように解決するのですか?

このような関連付けを行うには、FactoryGirlのコールバックを使用する必要があります。

完璧なサンプルはここにある。

https://thoughtbot.com/blog/aint-no-calla-back-girl

例題に持ち込むと

Factory.define :listing_with_features, :parent => :listing do |listing|
  listing.after_create { |l| Factory(:feature, :listing => l)  }
  #or some for loop to generate X features
end