当前位置:  开发笔记 > 编程语言 > 正文

我如何模拟Python方法OptionParser.error(),它执行sys.exit()?

如何解决《我如何模拟Python方法OptionParser.error(),它执行sys.exit()?》经验,为你挑选了1个好方法。

我正在尝试单元测试一些看起来像这样的代码:

def main():
    parser = optparse.OptionParser(description='This tool is cool', prog='cool-tool')
    parser.add_option('--foo', action='store', help='The foo option is self-explanatory')
    options, arguments = parser.parse_args()
    if not options.foo:
        parser.error('--foo option is required')
    print "Your foo is %s." % options.foo
    return 0

if __name__ == '__main__':
   sys.exit(main())

使用如下代码:

@patch('optparse.OptionParser')
def test_main_with_missing_p4clientsdir_option(self, mock_optionparser):
    #
    # setup
    #
    optionparser_mock = Mock()
    mock_optionparser.return_value = optionparser_mock
    options_stub = Mock()
    options_stub.foo = None
    optionparser_mock.parse_args.return_value = (options_stub, sentinel.arguments)
    def parser_error_mock(message):
        self.assertEquals(message, '--foo option is required')
        sys.exit(2)
    optionparser_mock.error = parser_error_mock

    #
    # exercise & verify
    #
    self.assertEquals(sut.main(), 2)

我正在使用迈克尔福德的模拟,并试图进行测试.

当我运行测试时,我得到:

  File "/Users/dspitzer/Programming/Python/test-optparse-error/tests/sut_tests.py", line 27, in parser_error_mock
    sys.exit(2)
SystemExit: 2

----------------------------------------------------------------------
Ran 1 test in 0.012s

FAILED (errors=1)

问题是OptionParser.error执行sys.exit(2),因此main()自然依赖于它.但是nose或unittest检测到(预期的)sys.exit(2)并且未通过测试.

我可以通过在main()中的parser.error()调用下添加"return 2"并从parser_error_mock()中删除sys.exit()调试来进行测试,但是我觉得修改测试中的代码是令人讨厌的.允许测试通过.有更好的解决方案吗?

更新:df的答案有效,尽管正确的调用是"self.assertRaises(SystemExit,sut.main)".

这意味着测试会传递parser_error_mock()中sys.exit()中的数字.有没有办法测试退出代码?

顺便说一下,如果我补充一下,测试会更加强大:

self.assertEquals(optionparser_mock.method_calls, [('add_option', ('--foo',), {'action': 'store', 'help': 'The foo option is self-explanatory'}), ('parse_args', (), {})])

在末尾.

更新2:我可以通过将"self.assertRaises(SystemExit,sut.main)"替换为以下内容来测试退出代码:

try:
    sut.main()
except SystemExit, e:
    self.assertEquals(type(e), type(SystemExit()))
    self.assertEquals(e.code, 2)
except Exception, e:
    self.fail('unexpected exception: %s' % e)
else:
    self.fail('SystemExit exception expected')

dF... 12

这会有效assertEquals吗?

self.assertRaises(SystemExit, sut.main, 2)

这应该捕获SystemExit异常并阻止脚本终止.



1> dF...:

这会有效assertEquals吗?

self.assertRaises(SystemExit, sut.main, 2)

这应该捕获SystemExit异常并阻止脚本终止.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有