我有一个返回一组对象的方法,我正在为这个方法编写一个单元测试。是否有一种通用,整洁和惯用的方式来比较这些身份(而不是平等)?或者我是否需要自己编写合适的实现?
一个例子(有点人为设法保持简单):
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 :(得分: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))
但是,这是专门用于集合的,不能处理嵌套容器。
答案 1 :(得分:0)
一种简单但尽管不是最有效的方法:
def assertContentIdentity(set1, set2):
set1 = set([id(a) for a in set1])
set2 = set([id(a) for a in set2])
assert set1 == set2
答案 2 :(得分:0)
从那以后,x就不会在这里工作了 会告诉我套装是 不同,我已经知道了。一世 想知道他们是否有对象 包含相同的对象或 不同的对象。
然后你需要编写自己的函数,比如
set([id(x) for x in X]) == set([id(y) for y in Y])