3

我有点鸡和蛋的问题。我有一个 Isp 模型,它有一个 default_domain _id,我需要为我的测试填充它。问题是域属于 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

应用程序/模型/domain.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 回答