python - 尝试断言有关异常的某些内容,但收到 AttributeError?

标签 python unit-testing exception assert

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

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/

相关文章:

java - 具有多个私有(private)最终字段的测试 Config 类

python - 如何通过引发异常来 pytest 一个 python 函数

python - 如何更改 tkinter TreeView 中选定单元格的前景色或背景色?

python - 如果我之前评估的属性不是 True,我如何装饰 Python unittest 方法以跳过?

python - 如何模拟 ZipFile 构造函数?

java - 尝试/捕获异常未按计划工作

java - 美化函数中的异常处理

python - 如何在 PyOpenGL 上创建一个可以对鼠标移动执行 "perspective rotations"的相机?

python - 导入 BERT : module 'tensorflow._api.v2.train' has no attribute 'Optimizer' 时出错

Python docx 在保持样式的同时替换段落中的字符串