2010-12-12 65 views
1

我有一個方法返回一組對象,我正在爲此方法編寫一個單元測試。是否有一種通用的,整齊的和習慣的比較這些身份(而不是平等)的方式?或者我需要自己編寫一個合適的實現?比較兩個容器的內容標識

一個例子(有點做作保持簡單):

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])) 

重要的是,這裏的測試平等不會做,因爲變異的foo_objects_that_have_property()返回的對象可能導致不一致的結果取決於如何將這些對象在Container中使用不同,即使在測試時它們「相等」。

+0

這是非常不清楚你問這裏。你想要比較哪些對象?他們爲什麼應該是一樣的?使用'x是y'測試身份。 – Falmarri 2010-12-12 23:28:20

+0

我想發現兩個容器(本例中爲集合)是否相同並且不相等。 「x是y」在這裏不起作用,因爲那會告訴我這些集合是不同的,我已經知道了。我想知道它們包含的對象是相同的對象還是不同的對象。 – 2010-12-12 23:31:57

+1

爲什麼重要的是物體是相同的,只要它們相同?考慮到集合本身在確定容器中是否有重複內容時考慮了平等而非身份。還要考慮對於用戶定義的類型,相等性測試默認爲對身份的測試。 – 2010-12-12 23:43:44

回答

0

我能想出的最好的是:

@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)) 

然而,這是專門爲套,不能與嵌套容器處理。

0

一個簡單的,雖然不是最有效的,辦法做到這一點:

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爲y不會在這裏工作,因爲這 會告訴我,集 不同的,這是我已經知道了。 I 想要知道它們包含的對象是相同的對象還是不同的對象 。

然後,你需要編寫自己的功能,如

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