试图对异常断言,但得到一个 AttributeError?

Trying to assert something about an exception, but get an AttributeError?

我真的不明白这个错误指的是什么

AttributeError("'_AssertRaisesContext' object has no attribute 'exception'",). 

我正在尝试编写一个接受两个参数 a 和 b 的函数 power 并计算 a 的 b 次幂,如果输入是任何其他整数或浮点数。

这是我的代码:

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:

raise TypeError('Argument must be integer or float')

接下来,您将断言置于错误的缩进级别。 with assertRaises() 上下文管理器的要点是捕获 with 块中的代码引发的异常。该块中的任何其他代码都不会被执行;异常退出块。

您需要在 块之后对消息进行断言。这样 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'
)