将FactoryGirl特征应用于Mongoid嵌入对象

时间:2013-03-06 00:10:52

标签: ruby-on-rails-3 mongoid factory-bot

我正在使用Mongoid构建Rails 3.2.11应用程序。我用Cucumber测试并用FactoryGirl创建测试对象。我有嵌入对象。我希望能够将FactoryGirl特性与我的父对象和嵌入对象一起使用,以进行大量排列并保持干燥。

问题:我似乎无法获得应用于嵌入对象的特征。

model.rb (实际上,单独的模型文件)

class User    
   include Mongoid::Document

   #Fields and stuff
   embeds_one :car
end

class Car    
   include Mongoid::Document

   #Fields and stuff
   embedded_in :user 
end

规格/ factories.rb

FactoryGirl.define do
  factory :user do

    status 'active'     # shared attribute  

    trait :bob do
     name 'Bob'
     email 'bob@bob.com'
    end

    trait :carol do
     name 'Carol'
     email 'carol@carol.com'
    end

    car  { [FactoryGirl.build(:car)] }

  end

  factory :car do

    number_of_tires 4   # shared attribute

    trait :red_ford do
     make 'Ford'
     color 'Red'
    end

    trait :blue_chevy do
     make 'Chevy'
     color 'Blue'
    end

  end
end

features / step_definitions / user_steps.rb (无法正常工作)

Given /^There is a user Bob with a Blue Chevy$/ do
  FactoryGirl.create(:user, :bob, :car => [:car => :blue_chevy])
end

如果我不使用嵌入式对象特征,我可以在工厂中创建用户对象。是否有任何方法可以使用所需的特征构建嵌入对象?谢谢!

修复

Thoughtbot http://joshuaclayton.me的Joshua Clayton说:

  

将特征应用于关联没有简写语法;   基本上,你必须做这样的事情:

cars = [FactoryGirl.build(:car, :blue_chevy)]
FactoryGirl.create(:user, :bob, cars: cars)

1 个答案:

答案 0 :(得分:2)

因为它是1对1的关系,所以在spec / factories.rb中构建car对象时不需要数组

car { FactoryGirl.build(:car) }

这也适用于黄瓜步骤。另外,据我所知,traits被用作属性,所以你的步骤代码看起来应该是

FactoryGirl.create(:user, :bob, :car, :blue_chevy)