0

我在 RSPEC 中使用过很多次工厂女孩,但这个月我的任务是在我们的测试套件中实现 Cucumber 故事。我想我可能有一个我不太确定的问题。

我们的“主要”帐户模型称为“公司”。用户、员工等等等等都属于这个。一些直接通过 f/k 其他通过委托。我们使用 factory-girl 的旧方式设置了许多使用 Factory girl 构建的模型的实例变量。

即在“spec_helper.rb”中

@grade_system = FactoryGirl.create(:grade_system)
@asset_size = FactoryGirl.create(:asset_size)
@asset_size.grades.create!(FactoryGirl.attributes_for(:grade))
@company = FactoryGirl.create(:company, :asset_size => @asset_size, :grade_system => @grade_system)

这是相当愚蠢的国际海事组织。

尝试使用“已定义属性:关联”的正确关联修复工厂时,我不断收到错误消息。我猜是因为使用属于员工的工厂创建的用户都使用具有关联的工厂构建:公司,导致冲突。但这不是唯一的例子。我想我的问题是,这种情况的最佳做法是什么。我觉得如果我可以剔除一家公司并将其分配给所有需要它的工厂,这可能会起作用,或者将所有适当的关联塞入公司工厂,但无法使用 FactoryGirl 建立用户.build(:用户)。.... 或者我只是错过了关联如何运作的要点?

FactoryGirl.define do
  factory :company do

   sequence(:name)                    { |n|  "Company#{n}" }
   sequence(:subdomain)               { |n| "subdomain#{n}" }  
   first_time_setup                   false

   non_exempt_multiplier              1.2
   exempt_multiplier                  1.2
   executive_multiplier               1.2

   primary_contact_first_name         'Jarrett'
   primary_contact_last_name          'Green'
   primary_contact_email              'tes@test.com'
   primary_contact_phone              '(555) 555-5555'
   hours_considered_part_time         30
   hours_considered_full_time         40

   association :industry
   association :grade_system
   association :asset_size

 end
end

######################################

FactoryGirl.define do
  require 'faker'
  factory :employee do

    association :company
    association :position
    association :branch

    first_name                Faker::Name.first_name
    last_name                 'Smith'
    pay_basis                 'salary'
    current_salary            10000.00
    date_in_position          (Date.today)
    sequence(:internal_id)    { |n| n }  

    user
  end
end

############################################################

FactoryGirl.define do
  factory :user do
    association :company 
    sequence(:login)          {|l|  "user#{l}@test.com"}
    sequence(:first_name)     {|fn| "UserFirstName#{fn}"}
    sequence(:last_name)      {|ln| "UserLastName#{ln}"}
    password                  'thisisthepassword'
    password_confirmation     'thisisthepassword'
  end
end
4

1 回答 1

1

处理这个问题的一个有趣的方法是使用 Fixtures 作为父记录,然后在工厂中定义它们。为每个模型创建一个有效的夹具,然后您可以在工厂定义中分配它,如下所示:

association : grade_system { GradeSystem.find(12345678) }

其中数字是灯具的 ID。

这种方法有一些好处。首先,它很快,因为您不会在每次创建子记录时都创建父记录,夹具在测试运行开始时加载一次并始终保持不变。其次,这很简单,每个灯具都有一个id基于灯具名称的编号 - 每次运行总是相同的,因此您可以放心find直接使用 - 它们还可以轻松链接关联,因此您无需创建建厂时父母的父母。第三,它很灵活,如果需要在创建或构建工厂时进行测试,您始终可以传入另一个父级。

您可以避免大多数与固定装置有关的问题,因为您只创建每种类型中的一种以用作父母。

于 2012-09-18T12:59:28.490 回答