Как правильно выполнить юнит-тест FileNotFoundError

1

С модулем unittest, как я могу проверить FileNotFoundError возникает при открытии файла следующим образом:

func(filename):
    try:
        file = open(filename)
    except FileNotFoundError:
        exit()

Модуль Unittest

class TestFunc(unittest.TestCase):

    def test_func(self):
        self.assertRaises(FileNotFoundError, func, "no_exist.txt")

Полученная ошибка

AssertionError: FileNotFoundError, не созданный func

Теги:
unit-testing

2 ответа

3
Лучший ответ

Вы проглатываете исключение в своем обработчике исключений, поэтому ваш код вызова (unit тест) не знает, что ошибка была поднята, все, что он видит, это то, что ваш код запустился и вышел.

Рассмотрите возможность повторного поднятия, как в:

func(filename):
    try:
        file = open(filename)
    except FileNotFoundError:
        # Whatever else you want to do 
        raise

Еще лучше, ваш unit тест не должен зависеть от того, какой файл не существует - модульные тесты должны быть само собой разумеющимися по определению. Подумайте, насмехаясь над открытым методом, чтобы у вас было больше контроля.

  • 0
    но юнит-тесты должны не только проверять правильное поведение. наличие угловых падежей в аргументах (как пустые списки, ..) или обработка ошибок тоже должны быть проверены.
  • 0
    @rocksportrocker Абсолютно согласен. Я предполагаю, что OP должен смоделировать метод open, чтобы он мог быть уверен, что он выдаст ошибку FileNotFoundError, а не полагаться на то, что файловая система находится в определенном состоянии.
Показать ещё 1 комментарий
1

Использовать контекстный менеджер для исключения

Изменено в версии 2.7: Добавлена возможность использования assertRaises() в качестве менеджера контекста.

Если задан только аргумент исключения, возвращается менеджер контекста, чтобы тестируемый код мог быть написан как встроенный, а не как функция:

with self.assertRaises(SomeException):
    do_something()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню