2016-01-20 62 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