如何在Python nosetest中绕过“sys.exit()”?

20 投票
5 回答
15328 浏览
提问于 2025-04-17 07:25

看起来,当 Python 的 nosetest 遇到 sys.exit() 时,它会直接退出,而对这个内置功能进行模拟(也就是假装它不是真的)似乎没有效果。

5 个回答

7
import sys
sys.exit = lambda *x: None

请记住,程序在调用 sys.exit() 后,通常会认为自己已经结束了,所以如果你试图去修改这个行为,可能并不会真的解决问题...

9

如果你在用 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
41

你可以试着捕捉一下 SystemExit 这个异常。这个异常是在有人调用 sys.exit() 时产生的。

with self.assertRaises(SystemExit):
  myFunctionThatSometimesCallsSysExit()

撰写回答