assertRaises(TestCase)的怪异行为

时间:2018-07-07 13:21:29

标签: python python-3.x unit-testing

我一直在尝试/学习Python中的单元测试工作,并且遇到了这种奇怪的行为,我做错了什么吗?

课程

enum

测试

class Entity:

    def __init__(self, n):
        if not isinstance(n, int):
            raise TypeError('n must be a number.')
        self.n = n

第二个from src.entity import Entity class TestEntity(TestCase): def test__init__types(self): self.assertRaises(TypeError, Entity.__init__, "2") self.assertRaises(TypeError, Entity.__init__, 2) 中的测试是否会失败,因为2是一个数字,因此不会引发assertRaises?相反,它说确定。

1 个答案:

答案 0 :(得分:1)

Entity.__init__(self, n)接受两个个参数:selfn。您只提供了一个,就得到了TypeError

观察:

>>> class A:
...     def __init__(self, n):
...         print(n)
...         
>>> A.__init__('s')
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'n'

要测试构造函数,您可以执行以下操作:

with self.assertRaises(TypeError):
    Entity("2")

现在,为什么会发生,并且从哪里可以得到self的论点?问题是__init__随此参数自动提供为A.__new__,因此您可以自己调用A.__new__,这将导致看起来很奇怪的代码:

self.assertRaises(TypeError, A.__new__(A).__init__, "2")