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

时间:2017-08-31 14:31:34

标签: python unit-testing python-unittest

最简单的解释方法:

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,测试仍会通过。

2 个答案:

答案 0 :(得分:1)

解决方案:

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]) 都会做到这一点

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

{{1}}

答案 1 :(得分:0)

使用vars()

为模块,类,实例或具有 dict 属性的任何其他对象返回 dict 属性。

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