2017-07-19 83 views
4

我想測試一個函數在失敗時執行os._exit(2)。我看過sys.exit()使用SystemExit許多解決方案。我曾經讀過的Python3Python2文檔,似乎os._exit()不使用SystemExit是否可以測試使用`os._exit()`的函數?

不過,我已經在一樁案件this這是在我身邊的文檔的誤解,但它只是退出nosetest,這是甚至沒有一個測試失敗:

make: *** [test] Error 2 

這可能是由於函數調用os._exit(2)

+2

作爲最後的手段,如果你不會找到更好的解決辦法,只是重寫'os._exit'方法:https://repl.it/J82h/0 – bakatrouble

+2

你只是想測試的功能*調用*'os._exit(2)',或者你想測試實際的退出?如果是前者,你可以按照bakatrouble的建議嘲弄這個功能。但是如果是後者,你可能不得不編寫一個調用該函數的單獨程序,然後用'os.system'或者其他方法來測試該程序,以驗證它是否以該代碼退出。 – BrenBarn

+0

我想測試的函數是一個自定義錯誤函數:一旦調用,它會記錄錯誤消息,然後調用'os._exit(2)'。我想測試日誌記錄部分和退出部分。由於我只是想測試這個模塊,所以我不能真正觸及代碼。 – Hawker65

回答

2

os.system()返回值包含在高8位退出代碼,所以你可以檢查外部腳本的退出代碼是這樣的:

import os 

assert os.system('python script.py') >> 8 == 2 

你也可以嘲笑os._exit()sys.exit()

import os, sys 
import script 

os._exit = sys.exit 
script.tested_method() # raises SystemExit 
+0

看來,模擬工程與[解決方案]很好(https://stackoverflow.com/questions/15672151/is-it-possible-for-a-unit-test-to-assert-that-a-method -calls-sys-exit)我試過了。這是一個整潔的小技巧,用於我不知道的測試。感謝您的幫助! – Hawker65

+1

嘲笑將完成這項工作,但它不會完全複製原來的行爲。您可能會認爲'os._exit()'已經通過解釋器測試工具進行了測試。 – bakatrouble

1

unittest.mock.MagicMock對象可以很容易簡單地檢查是否函數被調用,而不需要他們執行他們的默認行爲。

from unittest import mock 
import os 

def funcToTest(): 
    os.exit(2) 

def test_func(): 
    os._exit = mock.MagicMock() 
    funcToTest() 
    assert os._exit.called 
相關問題