2011-03-22 74 views
0

我正在嘗試測試訂閱服務的關聯文檔。每個訂閱都嵌入在一個帳戶中並引用一個計劃。下面是代碼的各個位:使用factory_girl和mongoid來測試referenced_in/references_many

帳戶:

Factory.define :account, :class => Account do |a| 
    a.subdomain 'test' 
    a.agents { [ Factory.build(:user) ] } 
    a.subscription { Factory.build(:free_subscription) } 
end 

訂閱:

Factory.define :free_subscription, :class => Subscription do |s| 
    s.started_at Time.now 
    s.plan { Factory.build(:free_plan) } 
end 

計劃:

Factory.define :free_plan, :class => Plan do |p| 
    p.plan_name 'Free' 
    p.cost 0 
end 

錯誤:

Mongoid::Errors::InvalidCollection: Access to the collection for Subscription is not allowed since it is an embedded document, please access a collection from the root document. 

如果我註釋掉將計劃鏈接到訂閱的那一行,那麼測試可以正常工作,但顯然我無法測試訂閱是否有計劃。

任何建議將不勝感激。

UPDATE:

下面是型號:

class Account 
    include Mongoid::Document 

    field :company_name, :type => String 
    field :subdomain, :type => String 
    field :joined_at, :type => DateTime 

    embeds_one :subscription 

    accepts_nested_attributes_for :subscription 

    before_create :set_joined_at_date 

    private 

    def set_joined_at_date 
    self.joined_at = Time.now 
    end 
end 

class Subscription 
    include Mongoid::Document 

    field :coupon_verified, :type => Boolean 
    field :started_at, :type => DateTime 

    referenced_in :plan 
    embedded_in :account, :inverse_of => :subscription 
end 

class Plan 
    include Mongoid::Document 

    field :plan_name, :type => String 
    field :cost, :type => Integer 
    field :active_ticket_limit, :type => Integer 
    field :agent_limit, :type => Integer 
    field :company_limit, :type => Integer 
    field :client_limit, :type => Integer 
    field :sla_support, :type => Boolean 
    field :report_support, :type => Boolean 

    references_many :subscriptions 
end 
+0

您可以發佈模型,以便我們可以準確瞭解關係是如何設置的? – 2011-03-22 13:36:32

回答

5

您需要與訂閱創建一個帳戶,它是有效的。

Factory.define :free_subscription, :class => Subscription do |s| 
    s.started_at Time.now 
    s.plan { Factory.build(:free_plan) } 
    s.account { Factory(:account) } 
end