Python: 单元测试检查对象在不同位置是否相同?

Python: Unit Test to check if objects are same at different location?

最简单的解释方式:

import unittest
from element import Element

class TestHTMLGen(unittest.TestCase):

    def test_Element(self):
        page = Element("html", el_id=False)
        self.assertEqual(page, Element("html", el_id=False))  # this is where I need help

我收到以下错误:

AssertionError: <element.Element object at 0x025C1B70> != <element.Element object at 0x025C1CB0>

我知道对象不完全相同,但有什么方法可以检查它们是否相等?我认为 assertEqual 会起作用。

编辑:我正在使用 addTypeEqualityFunc。然而,我还是遇到了麻烦

def test_Element(self):
    page = Element("html", el_id=False)
    self.addTypeEqualityFunc(Element, self.are_elements_equal)
    self.assertEqual(page, Element("html", el_id=False))

def are_elements_equal(self, first_element, second_element, msg=None):
    print first_element.attribute == second_element.attribute
    return type(first_element) is type(second_element) and first_element.tag == second_element.tag and first_element.attribute == second_element.attribute

这是我得到的输出: 错误的 它说测试通过了。它不应该通过,因为 first_element.attribute 不等于 second_element.attribute。此外,即使我只有 return false 对应 are_elements_equal,测试仍然通过。

解决方案:

import unittest
from element import Element

class TestHTMLGen(unittest.TestCase):

    def test_Element(self):
        page = Element("html", el_id=False)
        self.addTypeEqualityFunc(Element, self.are_elements_equal)
        self.assertEqual(page, Element("html", el_id=False))  # this is where I need help

    def are_elements_equal(self, first_element, second_element, msg=None):
        self.assertEqual(type(first_element), type(second_element))
        self.assertEqual(first_element.tag, second_element.tag)
        self.assertEqual(first_element.attribute, second_element.attribute)

然而,很多时候self.assertEqual(vars(page), vars(Element("html", el_id=False)))就可以了

编辑:另外,我应该补充一下。我做了一个很酷的小函数,可以检查对象是否相等。在大多数情况下应该有效。

def are_elements_equal(self, first_element, second_element, msg=None):
    self.assertEqual(type(first_element), type(second_element))
    try:
        type(vars(first_element)) is dict
    except:
        self.assertEqual(first_element, second_element)
    else:
        for i in vars(first_element).keys():
            try:
                type(vars(vars(first_element)[i])) is dict
            except:
                if type(vars(first_element)[i]) is list:
                    for j in range(len(vars(first_element)[i])):
                        self.are_elements_equal(vars(first_element)[i][j], vars(second_element)[i][j])
                else:
                    self.assertEqual(vars(first_element)[i], vars(second_element)[i])
            else:
                self.are_elements_equal(vars(first_element)[i], vars(second_element)[i])

使用vars():

Return the dict attribute for a module, class, instance, or any other object with a dict attribute.

self.assertEqual(vars(page), vars(Element("html", el_id=False)))