【问题标题】:Factory Girl: Automatically assigning parent objectsFactory Girl:自动分配父对象
【发布时间】:2010-03-02 19:59:21
【问题描述】:

我刚刚进入 Factory Girl,我遇到了一个我确信应该容易得多的困难。我只是无法将文档扭曲成一个工作示例。

假设我有以下模型:

class League < ActiveRecord::Base
   has_many :teams
end

class Team < ActiveRecord::Base
   belongs_to :league
   has_many :players
end

class Player < ActiveRecord::Base
   belongs_to :team
end

我想做的是这样的:

team = Factory.build(:team_with_players)

让它为我培养一批玩家。我试过这个:

Factory.define :team_with_players, :class => :team do |t|
   t.sequence {|n| "team-#{n}" }
   t.players {|p| 
       25.times {Factory.build(:player, :team => t)}
   }
end

但这在:team=&gt;t 部分失败,因为t 并不是真正的Team,而是Factory::Proxy::Builder。我必须将一支球队分配给一名球员。

在某些情况下,我想建立一个 League 并让它做类似的事情,创建多个包含多个玩家的团队。

我错过了什么?

【问题讨论】:

  • 我刚刚遇到了同样的问题(同样的错误),环顾四周并没有找到解决方案。

标签: ruby-on-rails ruby unit-testing factory-bot


【解决方案1】:
Factory.define :team do |team|
  team.sequence(:caption) {|n| "Team #{n}" }
end

Factory.define :player do |player|
  player.sequence(:name) {|n| "John Doe #{n}" }
  player.team = nil
end

Factory.define :team_with_players, :parent => :team do |team|
  team.after_create { |t| 25.times { Factory.build(:player, :team => t) } }
end

【讨论】:

    【解决方案2】:

    这个怎么样:

    Factory.define :team_with_players, :class => :team do |t|
      t.sequence { |n| "team-#{n}" }
      t.players do |team| 
        25.times.collect { |n| team.association(:player) }
      end
    end
    

    【讨论】:

    • 但是如果玩家需要对球队的参考,我从哪里得到呢?在此示例中,“团队”指的是工厂对象...
    • 我有类似的东西:team.association(:player, :team_id => team) 看起来很奇怪,但对我有用。
    • 当我这样做时它会抱怨:“预期的团队,但是是 FactoryGirl::Proxy”或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多