Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图断言某个异常,但却得到AttributeError?_Python_Unit Testing_Exception_Assert - Fatal编程技术网

Python 试图断言某个异常,但却得到AttributeError?

Python 试图断言某个异常,但却得到AttributeError?,python,unit-testing,exception,assert,Python,Unit Testing,Exception,Assert,我真的不明白这个错误指的是什么 AttributeError("'_AssertRaisesContext' object has no attribute 'exception'",). 我正在尝试编写一个函数power,它接受两个参数a和b,并计算a提升到幂b,然后提升aTypeError,如果输入是int或float,则消息是参数必须是整数或float 这是我的代码: def power(a, b): try : if b == 0: return

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

AttributeError("'_AssertRaisesContext' object has no attribute 'exception'",). 
我正在尝试编写一个函数power,它接受两个参数a和b,并计算a提升到幂b,然后提升a
TypeError
,如果输入是int或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
块中的代码引发的异常。该块中的任何其他代码都不会执行;异常退出了块

您需要在块之后对消息进行断言。这样,
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'
)
函数的可能重复不会引发异常。它只是将一些字符串打印到标准输出,如果传递了错误类型,则返回
None
。有关详细信息,请参阅副本。