5

所以我在玩 Mongoid、Rspec 和 Factory_Girl,我在嵌入文档时遇到了一些问题。

我有以下模型:

class Profile    
   include Mongoid::Document

   #Fields and stuff
      embeds_one :address

   validates :address, presence: true 
end

class Address    
   include Mongoid::Document

   #Fields and stuff
      embedded_in :profile 
end

所以当我这样定义一个工厂时:

FactoryGirl.define do
  factory :profile do
    #fields

    address
  end
end

我收到这样的错误:

Failure/Error: subject { build :profile }
     Mongoid::Errors::NoParent:

       Problem:
         Cannot persist embedded document Address without a parent document.
       Summary:
         If the document is embedded, in order to be persisted it must always have a reference to it's parent document. This is most likely cause by either calling Address.create or Address.create! without setting the parent document as an attribute.
       Resolution:
         Ensure that you've set the parent relation if instantiating the embedded document direcly, or always create new embedded documents via the parent relation.

我通过将工厂更改为以下内容来使其工作:

FactoryGirl.define do
  factory :profile do
    #fields

    after(:build) do |p| 
      p.create_address(FactoryGirl.attributes_for(:address))
    end
  end
end

这行得通,但我希望有一种更原生的 Factory_Girl 方式来做到这一点。好像应该有。

提前致谢!

4

2 回答 2

11

您也可以这样做,如Factory Girl + Mongoid 嵌入式文档中所引用的:

FactoryGirl.define do
  factory :profile do |f|
    #fields
    address { FactoryGirl.build(:address) }
  end
end
于 2013-01-16T17:18:51.553 回答
3

尝试使用build_address而不是create_address. 在我看来,您的工厂已损坏,因为您试图在保留(创建)个人资料记录之前创建地址记录。build_*应该将所有必要的属性分配给父模型,然后它应该与它的嵌入关系一起被持久化。

于 2012-10-15T18:53:15.780 回答