Как обойти "sys.exit ()" в тесте на питоне? - PullRequest
13 голосов
/ 30 ноября 2011

Похоже, что тестирование Python завершится при обнаружении "sys.exit ()", и насмешка над этим встроенным не работает. Спасибо за предложения.

Ответы [ 4 ]

26 голосов
/ 30 ноября 2011

Вы можете попробовать перехватить исключение SystemExit . Он поднимается, когда кто-то звонит sys.exit().

with self.assertRaises(SystemExit):
  myFunctionThatSometimesCallsSysExit()
7 голосов
/ 30 ноября 2011
import sys
sys.exit = lambda *x: None

Имейте в виду, что программы могут разумно ожидать, что они не продолжатся после sys.exit(), поэтому исправление может не помочь ...

6 голосов
/ 01 декабря 2011

Если вы используете mock для исправления sys.exit, возможно, вы исправляете его неправильно.

Этот небольшой тест отлично работает для меня:

import sys
from mock import patch

def myfunction():
    sys.exit(1)

def test_myfunction():
    with patch('foo.sys.exit') as exit_mock:
        myfunction()
        assert exit_mock.called

, вызванный с помощью:

nosetests foo.py

выходы:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
2 голосов
/ 30 сентября 2015

Это пример в unittest framework.

with self.assertRaises(SystemExit) as cm:
    my_function_that_uses_sys_exit()
self.assertEqual(cm.exception.code, expected_return_code)
...