Сравнение двух контейнеров для идентификации их содержимого - PullRequest
1 голос
/ 13 декабря 2010

У меня есть метод, который возвращает набор объектов, и я пишу модульный тест для этого метода. Есть ли общий, аккуратный и идиоматический способ сравнения их на предмет идентичности (а не равенства)? Или мне нужно самому написать подходящую реализацию?

Пример (несколько придуманный, чтобы упростить его):

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, даже если они "равны" в то время теста.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2010

Простой, хотя и не самый эффективный способ сделать это:

def assertContentIdentity(set1, set2):
    set1 = set([id(a) for a in set1])
    set2 = set([id(a) for a in set2])
    assert set1 == set2
0 голосов
/ 13 декабря 2010

х это у, я не буду работать с тех пор сказал бы мне, что наборы разные, которые я уже знаю. я хочу знать, если объекты, которые они содержат те же объекты или разные предметы.

Затем вам нужно написать свою собственную функцию, например

set([id(x) for x in X]) == set([id(y) for y in Y])
0 голосов
/ 13 декабря 2010

Лучшее, что я могу придумать, это:

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

Однако, это специально для наборов и не может иметь дело с вложенными контейнерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...