2013-03-28 84 views

回答

85

是的。 sys.exit提高SystemExit,這樣你就可以assertRaises檢查:

with self.assertRaises(SystemExit): 
    your_method() 

SystemExit實例都被設置爲所提出的退出狀態屬性code,並通過assertRaises返回的上下文經理有陷入異常實例爲exception,因此檢查退出狀態很簡單:

with self.assertRaises(SystemExit) as cm: 
    your_method() 

self.assertEqual(cm.exception.code, 1) 

 

sys.exit Documentation

從Python退出。這是通過提高SystemExit例外來實現的......可以在外層攔截退出嘗試。

+1

+1,除了如果他想驗證它調用'sys.exit(1)'(而不是像'sys.exit(0)'),你需要實際聲明它的'code'是1.我想你可以用'assertRaisesRegexp(SystemExit,'1')'做到這一點? – abarnert 2013-03-28 00:37:22

+0

我只是在編輯:) – 2013-03-28 00:39:21

+0

我確定有一個'unittest'方法可以讓你傳遞一個異常和一個_callable謂詞來運行異常或其參數,而不僅僅是一個_regex模式_在字符串上運行它的第一個arg的代表......但我猜不是。還有其他的測試模塊嗎? – abarnert 2013-03-28 00:43:21

5

下面是一個完整的工作示例。儘管帕維爾出色地回答了這個問題,但我花了一段時間才弄明白這一點,所以我在這裏包括它,希望這會有所幫助。

import unittest 
from glf.logtype.grinder.mapping_reader import MapReader 

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping" 

class TestMapReader(unittest.TestCase): 

    def test_get_tx_names_incomplete_mapping_file(self): 
     map_reader = MapReader() 
     with self.assertRaises(SystemExit) as cm: 
      tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE) 
     self.assertEqual(cm.exception.code, 1) 
1

作爲附加的註釋帕維爾的出色答卷,你還可以檢查特定的狀態,如果他們在你正在測試的功能正在提供。例如,如果your_method()包含以下sys.exit("Error")將有可能以測試「錯誤」明確:

with self.assertRaises(SystemExit) as cm: 
    your_method() 
    self.assertEqual(cm.exception, "Error") 
1

我找到了答案,你的問題在Python Unit Testing documentation搜索「測試的例外」。使用你的例子,單元測試看起來像下面這樣:

self.assertRaises(SystemExit, your_function, argument 1, argument 2) 

記得包括測試你的函數所需的所有參數。

+0

謝謝你的完美 – sam 2016-06-23 15:53:13

相關問題