2010-06-19 5 views
1

J'ai un test unitaire pour mon application GAE:Google App Engine UnitTest: Difficulté avec assertEquals

def test_getNeighborhoodKeys_twoCourses(self): 
      cs1110, cs2110 = testutils.setUpSimpleCourses() 

      foo = getFooResult() 
      bar = getBarResult() 

    self.assertEquals(foo, bar) # fails 

Ceci est l'échec:

AssertionError: set([CS 1110: Untitled, CS 2110: Untitled]) != set([CS 2110: Untitled, CS 1110: Untitled]) 

Il me semble que devrait passer le test. Qu'est-ce qui ne va pas?

Répondre

5

On dirait les articles appartenant à des ensembles foo et bar sont d'un certain type très froussard qui remplace __repr__ - sinon, avec des types normaux, il y aurait des guillemets pour préciser exactement ce qui est à l'intérieur de ces supports. Ainsi, ce type doit également remplacer __eq__ pour déterminer les conditions d'égalité (sinon, par défaut, deux instances sont égales uniquement si elles sont instance). Vous pouvez alternativement remplacer __cmp__, mais c'est une approche assez ancienne et poussiéreuse - des comparaisons spécifiques telles que __eq__ sont grandement préférées de nos jours!

Si vous faites passer outre __eq__ (ou __cmp__ pour cette matière) assurez-vous de passer outre aussi __hash__ car il est crucial que deux cas qui comparent égale ont exactement le même hachage trop, sinon utiliser des cas tels que les membres des ensembles, ou clés dans les dictionnaires, se comporte mal dans des manières très difficiles à prédire.

+0

En fait, je remplace moi-même '__repr__' pour faciliter le débogage. Était-ce une mauvaise décision? Que faire si je devais remplacer "__str__'"? Puis-je laisser "__eq__' et" __hash__' seuls? –

+0

@Rosarch, vous devez surcharger '__eq__' (et' __hash__' peut-être) chaque fois que vous voulez que des instances d'un type codé par un utilisateur puissent comparer des égales sans être identiques (c'est-à-dire la même instance) - la seule raison mentionné le remplacement de '__repr__' est parce que ce qui peut être immédiatement repéré dans le message que vous avez montré, et prouve que les instances appartiennent à un type funky et ne sont pas exactement la même instance, ** pas ** parce que cette substitution a quelque chose à faire avec l'égalité-test en soi. –