在unittest.TestCase中重载failUnlessEqual
我想在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定义的别名。
要让它正确工作,你需要在你的子类中重复这些赋值,从而重新定义这三个名字。