2010-12-12 57 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])