1

アプリには次のモデルがあります。

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 にも影響すると思います)。他のテストでは役に立ちましたが、ここでは効果がありません。

セットアップ ブロックのアサートは、4 回の実行のうち約 1 回で失敗します。私はMySQLを疑おうとしています... RubyMineからデバッグすると、リロードステートメントですべてが通過しますが、コマンドラインからは通過しません。

4

1 に答える 1

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
于 2010-09-11T13:55:39.957 に答える