3

FactoryGirl を使用して、Parent has_many Entries の関連付けを持つテスト データベースを作成しようとしています。この時点で、親を空白にすることはできないという ActiveRecord 検証エラーがスローされます。私はこれに苦労しており、この関連付けを使用してこのテストデータベースを作成するための多くの方法を試しました。私は近くにいると思いますが、私は近くにさえいないかもしれませんし、基本的なエラーがあるかもしれないので、あらゆるアドバイスは大歓迎です.

私の推測では、ハッシュ {parent_id::id} がエントリ ファクトリに渡されていません。それは検証に失敗します。しかし、それが実際に当てはまるかどうかはわかりませんし、たとえそうであったとしても、それを修正する方法がわかりません。ご協力いただきありがとうございます...

エラーは次のとおりです。

ActiveRecord::RecordInvalid: 検証に失敗しました: 親を空白にすることはできません

RSpec 呼び出しは次のとおりです。

before(:all) do
  rand(11..25).times { FactoryGirl.create(:parent) }
  visit "/parents?direction=asc&sort=parent_blog"  
end
after(:all)  do
  Parent.delete_all
end

親モデルは次のとおりです。

class Parent < ActiveRecord::Base
  has_many :entries, dependent: :destroy
  accepts_nested_attributes_for :entries, :allow_destroy => :true
  validates :parent_blog, presence: true,
              uniqueness: true
end

エントリーモデルは次のとおりです。

class Entry < ActiveRecord::Base
  belongs_to :parent
  validates :entry_blog,     presence:true,
            uniqueness: true
  validates :parent_id,       presence: true
end

親工場は次のとおりです。

FactoryGirl.define do
  factory :parent do
    sequence(:parent_blog) { |n| "http://www.parent%.3d.com/ss" % n }
    entries { rand(5..15).times { FactoryGirl.create(:entry,  parent_id: :id) } }
  end
end

エントリ ファクトリは次のとおりです。

FactoryGirl.define do
  factory :entry do
    sequence(:entry_blog)      { |n| "http://www.parent%.3d.com/ss/entry%.3d" % [n, n] }
    parent_id                   { :parent_id }
  end
end
4

2 に答える 2

4

ファクトリ定義に対する次の変更は機能するはずです。後で戻ってきて、いくつかの説明を提供します。

FactoryGirl.define do

  factory :parent do
    sequence(:parent_blog) { |n| "http://www.parent%.3d.com/ss" % n }
    after(:create) {|parent| rand(5..15).times {FactoryGirl.create(:entry, parent: parent)}}
  end

  factory :entry do
    sequence(:entry_blog)   { |n| "http://www.parent%.3d.com/ss/entry%.3d" % [n, n] }
    parent
  end

end

https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associationsafterで説明されているように、:parentファクトリーでの使用の導入と のparent代わりの使用の 2 つの変更は、parent_idRSpec の関連付けサポートの例です。

コードが機能しなかった理由については、現時点では部分的な回答しか提供できません。最初の親作成の一部として含めることができない理由はentries、親レコードが作成されるまで親 ID を持っていないためですが、エントリを作成するには親 ID が必要Entryですparent_id。別の言い方をすれば、ブロックが親ファクトリで評価されparent_idたときに設定されていませんでした。entries

よくわからないのは、エントリ ファクトリで を置き換えて、それに対応parentして親ファクトリの呼び出しで を置き換えることができない理由です。上記を送信する前にそのバリアントを試してみましたが、次のエラーで失敗しました:parent_idparent: parentparent_id: parent.idFactoryGirl.create

  1) test
     Failure/Error: rand(11..25).times { FactoryGirl.create(:parent) }
     ArgumentError:
       Trait not registered: parent_id
     # ./spec/factories.rb:4:in `block (4 levels) in <top (required)>'
     # ./spec/factories.rb:4:in `times'
     # ./spec/factories.rb:4:in `block (3 levels) in <top (required)>'
     # ./tmp/factory_spec.rb:5:in `block (3 levels) in <top (required)>'
     # ./tmp/factory_spec.rb:5:in `times'
     # ./tmp/factory_spec.rb:5:in `block (2 levels) in <top (required)>'

それがわかった場合は、この回答を再度更新します。

于 2013-08-17T21:57:28.283 に答える