web-dev-qa-db-ja.com

RailsのRuby)でFactoryGirlを使用してネストされた属性を持つテストオブジェクトを作成するにはどうすればよいですか?

Invoiceモデルがあります。これにはItemsも含まれている可能性があります。

class Invoice < ActiveRecord::Base

  attr_accessible :number, :date, :recipient, :items_attributes

  belongs_to :user

  has_many :items

  accepts_nested_attributes_for :items, :reject_if => :all_blank, :allow_destroy => true

end

私はRSpecを使用してこれをテストしようとしています:

describe InvoicesController do

  describe 'user access' do

    before :each do
      @user = FactoryGirl.create(:user)
      @invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
      sign_in(@user)
    end

    it "renders the :show view" do
      get :show
      expect(response).to render_template :show
    end

  end

end

残念ながら、このテスト(および他のすべてのテスト)は、RSpecからの次のエラーメッセージで失敗します。

Failure/Error: @invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: items

テストに合格するアイテムを含む請求書を作成するにはどうすればよいですか?

私はFactoryGirlを使用して次のようなオブジェクトを作成しています:

factory :invoice do
  number { Random.new.Rand(0..1000000) }
  recipient { Faker::Name.name }
  date { Time.now.to_date }
  association :user
  items { |i| [i.association(:item)] } 
end

factory :item do
  date { Time.now.to_date }
  description { Faker::Lorem.sentences(1) }
  price 50
  quantity 2
end
14
Tintin81

これは、私がそれを理解しようとしたときにブックマークしたスタックの回答です。

factory-girl-nested-factory

編集:申し訳ありませんが、答えは純粋なFactoryGirlであり、rspecではないことに気づきました。

5
econduck

チェックしましたか https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

Has_many-associationsについての部分があります。基本的には、請求書の作成後にいくつかのアイテムを追加するもので請求書ファクトリを拡張することです。

1
Dimitri