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

时间:2017-04-14 08:33:27

标签: python unit-testing exception assert

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

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

我正在尝试编写一个接受两个参数a和b的函数幂,并计算一个上升到幂b,如果输入是其他任何内容,则使用消息TypeError引发Argument must be integer or 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'
      )

1 个答案:

答案 0 :(得分:2)

您有两个问题:

首先,你实际上没有提出异常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'
)