Ассоциация не находит созданные объекты в тестах

У меня есть следующие модели в моем приложении:

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)

Но я не вижу, чтобы добраться до корня проблемы. Я попытался отключить транзакционные фикстуры (я не использую фикстуры, но я думаю, что это также влияет на Factory girl), и это помогло в других тестах, но здесь это не имеет никакого эффекта.

Утверждение в блоке настройки дает сбой примерно в 1 из 4 запусков. Я пытаюсь заподозрить MySQL... Когда я отлаживаю его из RubyMine, все проходит с операторами перезагрузки, но не из командной строки.


person Honza    schedule 10.09.2010    source источник
comment
Я смог решить проблему, изменив код, который мне кажется несвязанным. Я обязательно вернусь к этому и узнаю, почему.   -  person Honza    schedule 14.09.2010


Ответы (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
person Jed Schneider    schedule 11.09.2010
comment
У меня уже есть этот тест, и он проходит - person Honza; 12.09.2010
comment
выводите как деревни, так и игру с оператором проверки, например, puts @villages.inspect, чтобы вы могли видеть их, когда тест не пройден. - person Jed Schneider; 12.09.2010