关联未在测试中找到创建的对象

时间:2010-09-10 22:36:26

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

我的应用程序中有以下模型:

class Game < ActiveRecord::Base
   has_many :players
   has_many :villages, :through => :players
end

class Village < ActiveRecord::Base
   belongs_to :player
end

class Player < ActiveRecord::Base
   belongs_to :game
   has_many :villages

   before_create :build_starting_village

   protected

   def build_starting_village
     villages.build(some_attributes)
   end
end

我正在使用Shoulda / FactoryGirl测试游戏功能的某些部分,这是测试:

  setup do
    @villages = []
    5.times do |i|
      p = Factory(:player, :game => @game)
      v = p.villages.first
      assert v
      @villages << v
    end
    assert_equal @villages.size, @game.villages.size
  end

问题是最后一个断言失败了。我尝试了很多丑陋的事情,如:

    @game.villages(true)
    @game.players(true)
    @game = Game.find(@game.id)

但我无法看到问题的根源。我试过禁用事务夹具(我不使用夹具,但我认为这也会影响工厂女孩)并且它在其他测试中有所帮助,但在这里没有效果。

设置块中的断言在大约4次运行中失败。我试图怀疑MySQL ...当我从RubyMine调试它时,一切都通过重载语句传递,但不是来自命令行。

1 个答案:

答案 0 :(得分:1)

尝试断言除了真实之外的其他东西,因为它可以是任何东西,例如assert_instance_of Village

以下情况会发生什么?请原谅我有任何轻微的语法错误,暂时没有使用test :: unit / shoulda,但在你的代码中,不确定@game来自哪里

def test_player_has_village_on_new
  p = Factory(:player, :game => Factory(:game))
  assert_equal 1, p.villages.size
end