0

私は FactoryGirl (および一般的にテスト) を初めて使用し、has_many 関係のファクトリを設定しようとしています。これまでに見つけた例はすべて、以前のバージョンの factory girl を使用しており、公式ドキュメントはそれほど役に立ちませんでした。

テストを実行すると、次のように表示されます。

Failures:

  1) Brand has a valid factory
     Failure/Error: FactoryGirl.create(:brand).should be_valid
     ActiveRecord::RecordInvalid:
       Validation failed: Styles can't be blank
     # ./spec/models/brand_spec.rb:5:in `block (2 levels) in <top (required)>'

ブランド.rb

class Brand < ActiveRecord::Base
  attr_accessible               :title,
                                :style_ids

  has_many                      :brand_styles, dependent: :destroy
  has_many                      :styles,       through: :brand_styles

  validates_presence_of         :title
  validates_presence_of         :styles
end

style.rb

class Style < ActiveRecord::Base
  attr_accessible               :title

  has_many                      :brand_styles, dependent: :destroy
  has_many                      :brands,       through: :brand_styles

  validates_presence_of         :title
end

brand_style.rb

class BrandStyle < ActiveRecord::Base
  attr_accessible :brand_id, 
                  :style_id

  belongs_to      :brand
  belongs_to      :style
end

工場

FactoryGirl.define do
  factory :brand do
    title "Some Brand"

    after(:create) do |brand| 
      brand.style create(:brand_style, brand:brand, style: FactoryGirl.build(:style))
      brand.reload
    end
  end

  factory :style do
    title "Some Style"
  end

  factory :brand_style do
    brand
    style
  end
end

スペック

require 'spec_helper'

describe Brand do
  it "has a valid factory" do
    FactoryGirl.create(:brand).should be_valid
  end
end

- -編集 - -

Damien Roches の提案に従って工場を変更したところ、次のエラーが発生しています。

Failures:

  1) Brand has a valid factory
     Failure/Error: FactoryGirl.create(:brand).should be_valid
     NoMethodError:
       undefined method `primary_key' for #<FactoryGirl::Declaration::Implicit:0x007fc581b2d178>
     # ./spec/factories/brand.rb:4:in `block (3 levels) in <top (required)>'
     # ./spec/models/brand_spec.rb:5:in `block (2 levels) in <top (required)>'

改造工場

FactoryGirl.define do
  factory :brand do |brand|
    brand.title "Some Brand"
    brand.styles { build_list(:brand_style, 1, brand: brand, style: build(:style)) }
  end

  factory :style do
    title "Some Style"
  end

  factory :brand_style do
    brand
    style
  end
end
4

1 に答える 1

0

after(:create)ブロックを次のように置き換えます。

styles { build_list(:brand_style, 1, brand: brand, style: build(:style)) }

私のfactory_girl知識は少し大雑把なので、さらに問題が発生した場合はお知らせください。機会があれば返信します。

いくつかのメモ。モデルが を必要とするafter(:create)ため、使用できません。の関係のためご利用いただけません。それはする必要があります。これでは、割り当てが配列を想定しているため、使用できません。を使用することもできますが、私は.brandstylesbrand.stylehas_manybrand.stylesbrand.styles = create()brand.styles = [create()]create_list

と交換create(:brand_style)しましたbuild。構成によっては、親オブジェクトを保存するときに関連付けが保存されないことがあることがわかったので、さまざまなバリエーションをテストします。詳しくはこちらをご覧ください。

于 2013-10-26T06:31:07.987 に答える