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

5

最简单的解释是:

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

这是我得到的输出结果: False 并且它显示测试通过了。但事实上,第一个元素的属性值并不等于第二个元素的属性值,因此测试不应该通过。此外,即使我在are_elements_equal中只返回false,测试仍然会通过。

你能发布一下元素的样子吗?对象初始化可能会创建不同的属性/特性。不过你是对的,assertEqual本质上执行的是==检查,这应该足以确定对象是否相同:类似的问题。如果你使用的是Python 2.5或更高版本,你也可以创建自己的_eq_()方法来检查相等性。 - ajoseps
你也可以为这些对象创建一个addTypeEqualityFunc - ajoseps
@ajoseps,请检查修改。 - Slaknation
1
在文档中提到,你需要引发一个异常才能使其失败:当检测到前两个参数之间的不等式时,它必须引发self.failureException(msg) - 可能在错误消息中提供有用的信息并详细解释不等式。 - ajoseps
2个回答

3

解决方案:

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

1

使用vars()

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接