在unittest.TestCase中重载failUnlessEqual

0 投票
1 回答
643 浏览
提问于 2025-04-15 13:52

我想在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 个回答

2

你在调用assertEqual,但定义的是failUnlessEqual。那么你为什么会期待你的方法被调用呢?毕竟,你实际上是在调用一个不同的方法。

也许你查看过TestCase的定义,看到这一行

assertEqual = assertEquals = failUnlessEqual

这意味着assertEqual和failUnlessEqual是同一个定义。不幸的是,这并不意味着重写failUnlessEqual就会同时重写assertEqual——assertEqual仍然是基类中failUnlessEqual定义的别名。

要让它正确工作,你需要在你的子类中重复这些赋值,从而重新定义这三个名字。

撰写回答