Почему при тестировании выдает TypeError: 'NoneType' object is not callable?
При тестировании функции, которая считает количество конечных нулей факториала, выдает ошибку:
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)
Как лучше всего вызывать ошибку при отрицательном значении, чтобы мы могли это нормально тестировать?
Ответы (1 шт):
Тут у вас две проблемы.
Во-первых, вы неправильно используете assertRaises. Вторым аргументом эта функция ожидает функцию, которую она вызовет и будет проверять, бросит ли такой вызов исключение того, типа что передан в первом параметре.
Вы же передаете не функцию, а результат вызова функции. Если бы функция zeros для отрицательного аргумента бросила бы ислючение, то выполнение до assertRaises вообще не дошло. zeros сейчас работает неправильно и исключения не бросает - это вторая проблема.
Сейчас же результатом работы функции является None, assertRaises пробует использовать его как функцию и ожидаемо не может - ошибка об этом и говорит 'NoneType' object is not callable.
Нужно делать так:
def test_argument_less_zero(self):
self.assertRaises(ValueError, zeros, -5)
А еще лучше и удобней использовать assertRaises как контекстный менеджер:
def test_argument_less_zero(self):
with self.assertRaises(ValueError):
zeros(-5)
Ну и конечно нужно исправить саму функцию, чтоб она таки бросала исключение, если агрумент отрицательный.