当测试一个计算阶乘的尾随零个数的函数时,它会给出一个错误:
TypeError: 'NoneType' object is not callable
函数检查参数是否是整数,如果不是,那么我们会引发错误raise ValueError
函数本身:
def zeros(n: int) -> int:
number_of_zeros: int = 0
try:
if n > 0 and n % int(n) == 0:
counter: int = int(math.log(n, 5))
for i in range(1, counter + 1):
number_of_zeros += int(n/(5 ** i))
return number_of_zeros
elif n == 0:
return 0
else:
print(f'{n} must be a positive integer!!')
raise ValueError
except ValueError as error:
print(error)
该功能的测试:
class FatorialTestCase(unittest.TestCase):
def test_argument_less_zero(self):
result = zeros(-5)
self.assertRaises(ValueError, result)
在负值上抛出错误以便我们可以正常测试它的最佳方法是什么?
这里有两个问题。
首先,您使用了错误的
assertRaises. 作为第二个参数,此函数需要一个它将调用的函数,并将检查这样的调用是否会引发第一个参数中传递的类型的异常。您传递的不是函数,而是函数调用的结果。如果
zeros否定参数的函数会引发异常,则assertRaises根本不会执行。zeros现在它工作不正常并且不会抛出异常 - 这是第二个问题。现在函数的结果是
None,assertRaises尝试将其用作函数,并且正如预期的那样,不能 - 错误说 this'NoneType' object is not callable。你需要这样做:
甚至更好、更方便地
assertRaises用作上下文管理器:当然,您需要修复函数本身,以便在参数为负时它仍然会引发异常。