2016-01-20 63 views
1

我已经得到编译为.exe的Python应用程序。
在某些情况下,程序与sys.exit()终止,但不关闭控制台窗口,我用下面的代码,它工作正常,这样做:unittest中的系统(“暂停”)

try: 
    sys.exit() 
except SystemExit: 
    raise 
finally: 
    os.system("pause") 

的问题是,我需要测试如果我的代码提出SystemExit,但由于电影阻塞,测试无法通过 - 它们只是无限的。
有没有可能让单元测试通过os.system("pause")
我可以添加一个默认参数,这将防止暂停,但在我的情况下会很复杂 - 如果有任何可能,我想在单元测试中做到这一点。

+0

你为什么要在应用程序级别上执行单元测试? –

+1

只是为该测试修补'os.system' – kwarunek

+0

@ ignacio-vazquez-abrams - 我正在运行具有特定参数的main()函数并检查它是否引发SystemExit - 如何在unittests中测试这个不知道我是否正确理解你的评论)? @kwarunek - 你能说更多吗? – Djent

回答

2

我只是简单地模拟os.system。甚至在sys.exit甚至可以断言它是否被调用。

# your_module.py 
import sys 
import os 


def something(): 
    try: 
     sys.exit() 
    except SystemExit: 
     raise 
    finally: 
     os.system("pause") 

而且测试

import unittest 
import your_module 
try: 
    from unittest.mock import patch 
except ImportError: 
    from mock import patch 


class TestSysexit(unittest.TestCase): 

    @patch('your_module.os.system') 
    def test_system_exit(self, mock_os_system): 

     with self.assertRaises(SystemExit): 
      your_module.something() 
     mock_os_system.assert_called_once_with('pause') 

if __name__ == '__main__': 
    unittest.main() 

模拟和补丁是unittest.mock上python3并在python2模拟库。

+0

正如我所看到的,mock在Python 3.3中是新的 - 我正在使用Python 2.7。 – Djent

+0

python2'pip install mock'' from mock import patch'' – kwarunek

+0

我已经编辑完整的示例py2/py3 comp的答案。 – kwarunek