Подтвердить что ты не робот

Возможно ли, чтобы unit test утверждал, что метод вызывает sys.exit()

У меня есть метод python 2.7, который иногда вызывает

sys.exit(1) 

Можно ли сделать unit test, который проверяет, что эта строка кода вызывается при выполнении правильных условий?

4b9b3361

Ответ 1

Да. sys.exit вызывает SystemExit, поэтому вы можете проверить его с помощью assertRaises:

with self.assertRaises(SystemExit):
    your_method()

У экземпляров SystemExit есть атрибут code, который настроен на предлагаемый статус выхода, а менеджер контекста, возвращенный assertRaises, имеет экземпляр исключенного исключения как exception, поэтому проверка состояния выхода проста:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)

 

sys.exit Документация:

Выход из Python. Это реализуется путем создания исключения SystemExit... можно перехватить попытку выхода на внешнем уровне.

Ответ 2

Вот полный рабочий пример. Несмотря на отличный ответ Павлу, мне потребовалось некоторое время, чтобы понять это, поэтому я включаю его здесь в надежде, что это будет полезно.

import unittest
from glf.logtype.grinder.mapping_reader import MapReader

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"

class TestMapReader(unittest.TestCase):

    def test_get_tx_names_incomplete_mapping_file(self):
        map_reader = MapReader()
        with self.assertRaises(SystemExit) as cm:
            tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
        self.assertEqual(cm.exception.code, 1)

Ответ 3

В качестве дополнительной заметки к Великому ответу Павла вы также можете проверить определенные статусы, если они предоставлены в тестируемой функции. Например, если your_method() содержит следующее sys.exit("Error"), можно было бы проверить для "Ошибка" конкретно:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")

Ответ 4

Я нашел ответ на ваш вопрос в Документации по тестированию модулей Python, чтобы найти "Тестирование для исключений". Используя ваш пример, unit test будет выглядеть следующим образом:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

Не забудьте включить все аргументы, необходимые для проверки вашей функции.