【问题标题】:How can I raise this exception properly?如何正确引发此异常?
【发布时间】:2021-10-14 00:01:28
【问题描述】:

如何正确引发此异常?

import unittest

def second_digit_value4(n): return True if n % 10 == 4 else False

class DigitValue4(unittest.TestCase):
    def test_last_digit_value4(self):
        self.assertEqual(second_digit_value4(14), True)
        self.assertFalse(second_digit_value4(22), False)

        with self.assertRaises(ValueError):
            second_digit_value4(23)

if __name__ == '__main__':
    unittest.main()

【问题讨论】:

  • 为什么在那里引发 ValueError?
  • 我是一个完整的菜鸟,这只是为了练习。这是一个练习,我需要确保第二个数字等于 4。创建 Value 错误的目的是为了练习。
  • 练习一些应该引发异常的东西。
  • @YoshuaVillar:这里的问题是没有理由为什么22 应该返回False23 死了ValueError。您没有描述区分这两种情况的规则,只是描述何时应该返回 True 的规则。
  • 为什么它会返回ValueError?当参数类型正确但值无效时使用。但是什么数字对测试最后一位无效?

标签: python exception python-unittest


【解决方案1】:

由于该函数仅适用于 2 位数的正数,因此它应该检查参数是否在 10 到 99 之间。然后您应该使用超出该范围的数字对其进行测试。

import unittest

def second_digit_value4(n): 
    if 10 <= n <= 99:
        return n % 10 == 4
    raise ValueError("number must be 2 digits")

class DigitValue4(unittest.TestCase):
    def test_last_digit_value4(self):
        self.assertEqual(second_digit_value4(14), True)
        self.assertFalse(second_digit_value4(22), False)

        with self.assertRaises(ValueError):
            second_digit_value4(123)

if __name__ == '__main__':
    unittest.main()

【讨论】:

  • 所以要在测试中使用 raise value error 我需要让它出现在函数上?
  • assertRaises 的重点是检查被测代码中是否引发了异常,否则为什么需要它?
【解决方案2】:

单元测试不需要抛出错误。他们检查事情是真是假,根据结果,测试要么通过,要么失败。

将您的测试修改为:

assertTrue(second_digit_value4(14), 'second_digit_value4 failed on 14')
assertFalse(second_digit_value4(22), 'second_digit_value4 failed on 22')

异常用于处理“意外”情况。您可以将函数修改为:

def second_digit_value4(n): 
if not n.isnumeric():
    raise ValueError("value must be a number")
if 10 <= n <= 99:
    return n % 10 == 4
else:
    raise ValueError("value out of range")

然后检查是否抛出异常:

def test1(self):
    with self.assertRaises(ValueError):
       second_digit_value4('This is NaN')

您可以为超出范围异常添加另一个测试。

它的作用是允许您的函数在不执行操作并返回结果的情况下返回,这在该输入上是不可能的。

或者你可以只返回一个 NaN 而不是抛出。

【讨论】:

  • 但他们也可以测试是否引发了异常。这就是他们要问的问题。
猜你喜欢
  • 2020-08-13
  • 2011-11-11
  • 2014-06-13
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多