如何绕过“sys.exit()”在 python 鼻子测试中?

发布于 2024-12-19 00:57:58 字数 61 浏览 1 评论 0原文

看来 python nostest 在遇到 sys.exit() 时会退出,并且对此内置函数的模拟不起作用。

It seems that python nosetest will quit when encountered sys.exit(), and mocking of this builtin doesn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

毁我热情 2024-12-26 00:57:58

您可以尝试捕获 SystemExit 异常。当有人调用 sys.exit() 时会引发该异常。

with self.assertRaises(SystemExit):
  myFunctionThatSometimesCallsSysExit()

You can try catching the SystemExit exception. It is raised when someone calls sys.exit().

with self.assertRaises(SystemExit):
  myFunctionThatSometimesCallsSysExit()
等你爱我 2024-12-26 00:57:58

如果您使用 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

If you're using mock to patch sys.exit, you may be patching it incorrectly.

This small test works fine for me:

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

invoked with:

nosetests foo.py

outputs:

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

OK
迷乱花海 2024-12-26 00:57:58
import sys
sys.exit = lambda *x: None

请记住,程序可能合理地期望在 sys.exit() 之后不再继续,因此修补它可能实际上没有帮助......

import sys
sys.exit = lambda *x: None

Keep in mind that programs may reasonably expect not to continue after sys.exit(), so patching it out might not actually help...

烟沫凡尘 2024-12-26 00:57:58

这是 unittest 框架中的一个示例。

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

This is an example in the unittest framework.

with self.assertRaises(SystemExit) as cm:
    my_function_that_uses_sys_exit()
self.assertEqual(cm.exception.code, expected_return_code)
故事和酒 2024-12-26 00:57:58

从这篇关于 medium 的文章中:

def test_exit(mymodule):
    with pytest.raises(SystemExit) as pytest_wrapped_e:
            mymodule.will_exit_somewhere_down_the_stack()
    assert pytest_wrapped_e.type == SystemExit
    assert pytest_wrapped_e.value.code == 42

From this article on medium:

def test_exit(mymodule):
    with pytest.raises(SystemExit) as pytest_wrapped_e:
            mymodule.will_exit_somewhere_down_the_stack()
    assert pytest_wrapped_e.type == SystemExit
    assert pytest_wrapped_e.value.code == 42
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文