我真的不明白这个错误指的是什么
AttributeError("'_AssertRaisesContext' object has no attribute 'exception'",).
我正在尝试编写一个函数 power,它接受两个参数 a 和 b,并计算 a 的 b 次幂,并引发 TypeError
并显示消息 Argument must be integer or float
如果输入不是整数或 float 。
这是我的代码:
def power(a, b):
try :
if b == 0:
return 1
elif b == 1:
return a;
else:
return a*pow(a, b-1)
except TypeError :
print ('Argument must be integer or float')
这是我用来测试它的代码:
from unittest import TestCase
class PowerTestCases(TestCase):
def test_returns_correct_power(self):
base, exp = 2, 3
res = power(base, exp)
self.assertEqual(res, 8, msg='Expected {}, got {}'.format(8, res))
def test_return_1_when_exp_is_0(self):
base, exp = 4, 0
res = power(base, exp)
self.assertEqual(res, 1, msg='A number power 0 should be 1')
def test_return_0_when_base_is_0(self):
base, exp = 0, 10
res = power(base, exp)
self.assertEqual(res, 0, msg='O power any number should be 0')
def test_non_digit_argument(self):
with self.assertRaises(TypeError) as context:
base, exp = 'base', 'exp'
res = power(base, exp)
self.assertEqual(
'Argument must be interfer or float',
context.exception.message,
'Only digits are allowed as input'
)
最佳答案
您有两个问题:
首先,您实际上并没有引发异常。 print()
将数据写入 stdout
文件(通常连接到您的终端或控制台),这不是一回事。
使用加注
:
raise TypeError('Argument must be integer or float')
接下来,您将断言置于错误的缩进级别。 with assertRaises()
上下文管理器的要点是捕获 with
block 中的代码引发的异常。该 block 中的任何其他代码都不会被执行;异常退出了 block 。
您需要在 block 之后对消息进行断言。这样,assertRaises
还会注意到实际上是否没有引发异常,并且您会得到更有意义的断言错误:
with self.assertRaises(TypeError) as context:
base, exp = 'base', 'exp'
res = power(base, exp)
self.assertEqual(
'Argument must be interfer or float',
context.exception.message,
'Only digits are allowed as input'
)
关于python - 尝试断言有关异常的某些内容,但收到 AttributeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408020/