2010-09-10 22 views
1

je les modèles suivants dans mon application:Association ne pas trouver les objets créés dans les tests

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 

Je teste une partie de la fonctionnalité de jeu avec Shoulda/factorygirl, c'est le test:

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 

Le problème est que la dernière assertion échoue. Je l'ai essayé beaucoup de choses laides comme:

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

Mais je ne vois pas se rendre à la racine du problème. J'ai essayé de désactiver les fixations transactionnelles (je n'utilise pas d'appareils, mais je pense que cela affecte également Factory girl) et cela a aidé à d'autres tests mais ici cela n'a aucun effet.

L'assertion dans le bloc d'installation échoue dans environ 1 de 4 exécutions. J'essaie de suspecter MySQL ... Quand je le débogue à partir de RubyMine tout passe avec les instructions de rechargement, mais pas depuis la ligne de commande.

+0

Je suis en mesure de résoudre le problème en changeant ce me semble un code indépendant. Je vais certainement revenir à cela et découvrir pourquoi. – Honza

Répondre

1

essayer affirmer autre chose que truthiness parce qu'il pourrait être quelque chose, par exemple assert_instance_of Village

aussi ce qui se passe dans le cas suivant? Pardonnez-moi pour toutes les petites erreurs de syntaxe, n'ont pas utilisé épreuve :: unité/Shoulda dans un certain temps, mais dans votre code, pas sûr où @game vient de

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

J'ai déjà ce test et il passe – Honza

+0

à la fois les villages et le jeu avec une instruction d'inspection, par exemple 'puts @ villages.inspect' pour que vous puissiez les voir quand le test échoue. –