2010-12-12 37 views
1

J'ai une méthode qui retourne un ensemble d'objets, et j'écris un test unitaire pour cette méthode. Existe-t-il une façon générique, ordonnée et idiomatique de les comparer pour l'identité (plutôt que l'égalité)? Ou dois-je écrire moi-même une implémentation appropriée?Comparaison de deux conteneurs pour l'identité de leur contenu

Un exemple (spécieux de rester simple):

class Foo(object): 
    def has_some_property(self): 
     ... 

class Container(object): 
    def __init__(self): 
     self.foo_set = set() 

    def add_foo(self, foo): 
     self.foo_set.add(foo) 

    def foo_objects_that_have_property(self): 
     return set([foo for foo in self.foo_set if foo.has_some_property()]) 

import unittest 

class TestCase(unittest.TestCase): 
    def testFoo(self): 
     c = Container() 
     x, y, z = Foo(), Foo(), Foo() 
     ... 
     self.assertContentIdentity(c.foo_objects_that_have_property(), set([x, y])) 

Fait important, les tests ici pour l'égalité ne fera pas, puisque les objets retournés muter par foo_objects_that_have_property() peut conduire à des résultats incohérents en fonction de la façon dont ces objets sont utilisés différemment dans Container même s'ils sont "égaux" au moment du test.

+0

Il est assez clair que vous demandez ici. Quels objets essayez-vous de comparer? Pourquoi devraient-ils être les mêmes? Utiliser 'x is y' teste l'identité. – Falmarri

+0

Je veux savoir si deux conteneurs (ensembles dans ce cas) sont identiques et pas seulement égaux. 'x is y' ne fonctionnera pas ici car cela me dirait que les sets sont différents, ce que je sais déjà. Je veux savoir si les objets qu'ils contiennent sont les mêmes objets ou objets différents. –

+1

Pourquoi est-ce important que les objets soient identiques, à condition qu'ils soient égaux? Considérons que l'ensemble, lui-même, considère l'égalité plutôt que l'identité pour déterminer si quelque chose est dupliqué dans le conteneur. Considérez également que le test d'égalité est par défaut un test d'identité, pour les types définis par l'utilisateur. –

Répondre

0

Le meilleur que je peux trouver est:

@staticmethod 
def set_id(c): 
    return set([id(e) for e in c]) 

def assertContentIdentity(self, a, b): 
    self.assertEqual(set_id(a), set_id(b)) 

Cependant, ceci est spécialisé pour les jeux et ne peut pas traiter avec des conteneurs imbriqués.

0

Un simple, mais pas le plus efficace, façon de le faire:

def assertContentIdentity(set1, set2): 
    set1 = set([id(a) for a in set1]) 
    set2 = set([id(a) for a in set2]) 
    assert set1 == set2 
0

x est y ne fonctionnera pas ici depuis que me disait que les jeux sont différents, que je sais déjà. I veulent savoir si les objets qu'ils contiennent sont les mêmes objets ou différents objets.

Ensuite, vous devez écrire votre propre fonction, comme

set([id(x) for x in X]) == set([id(y) for y in Y])