在unittest.TestCase中重载failUnlessEqual

时间:2009-08-26 06:18:33

标签: python unit-testing overloading

我想在unittest.TestCase中重载failUnlessEqual,所以我创建了一个新的TestCase类:

import unittest

class MyTestCase(unittest.TestCase):
    def failUnlessEqual(self, first, second, msg=None):
        if msg:
            msg += ' Expected: %r - Received %r' % (first, second)
        unittest.TestCase.failUnlessEqual(self, first, second, msg)

我正在使用它:

class test_MyTest(MyTestCase):
    def testi(self):
        i = 1
        self.assertEqual(i, 2, 'Checking value of i')
    def testx(self):
        x = 1
        self.assertEqual(x, 2, 'Checking value of i')

这是我运行测试时得到的结果

>>> unittest.main()
FF
======================================================================
FAIL: testi (__main__.test_MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 4, in testi
AssertionError: Checking value of i

======================================================================
FAIL: testx (__main__.test_MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 7, in testx
AssertionError: Checking value of x

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=2)

我原以为该消息将是'正在检查x期待值:2 - 收到:1'

根本没有使用MyTestCase类。 你能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:2)

您正在调用assertEqual,但定义failUnlessEqual。那么为什么你会期望调用你的方法 - 毕竟你调用的是另一种方法?

也许您已经查看了TestCase的定义,并看到了

assertEqual = assertEquals = failUnlessEqual

这意味着assertEqual方法与failUnlessEqual具有相同的定义。不幸的是,这并不意味着重写failUnlessEqual也会覆盖assertEqual - assertEqual仍然是基类中failUnlessEqual定义的别名。

为了使其正常工作,您需要在子类中重复分配,从而重新定义所有三个名称。