Как обойти "sys.exit()" в nosetest python?

Кажется, что nosetest python прекратит свое существование, когда столкнутся с "sys.exit()", и насмехается над этим встроенным модулем. Благодарим за предложения.

Ответ 1

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

with self.assertRaises(SystemExit):
  myFunctionThatSometimesCallsSysExit()

Ответ 2

import sys
sys.exit = lambda *x: None

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

Ответ 3

Если вы используете 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

Ответ 4

Это пример в инфраструктуре unittest.

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