我有一个wxpython对话框,当单击OK按钮时引发TypeError异常。我想用unittest测试异常的发生情况,但是测试没有像预期的那样工作。输出显示异常被引发。无论如何,unittest通知测试失败:
"C:Program Files (x86)Pythonpython.exe" test.py
Traceback (most recent call last):
File "test.py", line 22, in on_ok
raise TypeError( 'TypeError raised' )
TypeError: TypeError raised
F
======================================================================
FAIL: test_should_raise (__main__.CDlgTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 34, in test_should_raise
self._dut.m_button_ok.GetEventHandler().ProcessEvent( event )
AssertionError: TypeError not raised
----------------------------------------------------------------------
Ran 1 test in 0.005s
FAILED (failures=1)
下面是我的代码的简化示例:
import unittest
import wx
class CDlgBase ( wx.Dialog ):
"""The UI"""
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent )
bSizerTest = wx.BoxSizer( wx.VERTICAL )
self.m_button_ok = wx.Button( self, wx.ID_ANY )
bSizerTest.Add( self.m_button_ok, 0 )
self.SetSizer( bSizerTest )
# Connect Events
self.m_button_ok.Bind( wx.EVT_BUTTON, self.on_ok )
def on_ok( self, event ):
event.Skip()
class CDlg( CDlgBase ) :
"""The dialog"""
def __init__(self, parent):
super( CDlg, self).__init__(parent)
def on_ok(self, event):
# The exception should be verified in the test `test_should_raise()`.
raise TypeError( 'TypeError raised' )
class CDlgTest( unittest.TestCase ) :
"""The test class"""
def setUp(self):
self._dut = CDlg(None)
def test_should_raise(self):
"""The test to verify raising the TypeError exception in the event
method `on_ok()`. this is the test method wich works not as expected."""
event = wx.CommandEvent( wx.EVT_BUTTON.evtType[0] )
event.SetEventObject( self._dut.m_button_ok )
with self.assertRaises( TypeError ) :
"""Simulate an "OK" click. `on_ok()` will be executed
and raises the TypeError exception."""
self._dut.m_button_ok.GetEventHandler().ProcessEvent( event )
if __name__ == '__main__':
app = wx.App()
tests = [ unittest.TestLoader().loadTestsFromTestCase( CDlgTest) ]
unittest.TextTestRunner(verbosity=2, failfast=True).run(unittest.TestSuite(tests) )
有人能帮我找出我做错了什么吗? 参见:https://wiki.wxpython.org/CppAndPythonSandwich
异常不会通过c++层向上传递调用堆栈。当控制从Python返回到c++时,它会检查是否存在未捕获的Python异常,如果是,则打印并清除错误。
在单元测试中处理这个问题的一种方法是在事件处理程序中捕获异常,并设置一个标志。然后回到测试代码中,您可以检查该标志是否被设置。