3

私は鶏と卵のタイプの問題を抱えています。テスト用に入力する必要がある default_domain _id を持つ Isp モデルがあります。問題は、ドメインが ISP に属していることです。だから私は工場を構築してISPを生成する方法を理解しようとしています

工場/isp.rb

FactoryGirl.define do
  factory :isp do
    sequence :name do |n|
      "ISP" + n.to_s
    end
  end
end

工場/ドメイン.rb

FactoryGirl.define do
  factory :domain do
    isp
    account
    sequence :dn do |n|
      "foo-#{n}.com"
    end
    active :true
  end
end

アプリ/モデル/isp.rb

class Isp < ActiveRecord::Base
  has_many :domains
  belongs_to :default_domain, class_name: 'Domain'
 end

アプリ/モデル/ドメイン.rb

class Domain < ActiveRecord::Base
  belongs_to :isp
  ...
 end

工場で after(:create) コールバックを使用してみましたが、循環参照が作成されているようです。ブロックを使用して遅延評価を試みました。同じこと。次はどこを見ればいいのか、何を試すべきなのか途方に暮れています..

4

2 に答える 2

1

もちろん、ここに投稿することで、自分が何を間違っていたのかをすぐに理解することができました..

このブログ投稿のヒント #4 を見つけました

http://randomsoftwareinklings.blogspot.com/2012/03/factory-girl-automatic-tests.html

それが私を導いた

 FactoryGirl.define do
  factory :isp do
    sequence :name do |n|
      "ISP" + n.to_s
    end
    default_domain {Domain.find_or_create_by_dn("#{name}.com") }
  end
end

期待どおりに動作するようになりました。

于 2012-10-18T19:26:14.560 に答える
0

解決策を見つけたようです。ただし、ファクトリを利用して default_domain 属性を作成する場合は、これを試してください。

まず、ファクトリdomainを参照しないようにファクトリを変更するとisp、循環参照を回避できます。

次に、ispファクトリ定義で、次のことができます。

FactoryGirl.define do
  factory :isp do
    sequence(:name) {|n| "ISP#{n}" }
    after_create do |isp|
      isp.default_domain = Domain.find_by_dn("#{isp.name}.com") ||
        FactoryGirl.create(:domain, :dn => "#{isp.name}.com")
      isp.save!
    end
  end

これにより、モデルのより複雑な属性に FactoryGirl を利用できます。また、ファクトリの外部からフィールドDomainをカスタマイズしたい場合は、dn一時的な属性を使用してafter_createフックで利用できます。

于 2012-10-18T20:17:18.277 に答える