1

[OK] ボタンをクリックすると TypeError 例外が発生する wxpython ダイアログがあります。unittest で例外の発生をテストしたいのですが、テストが期待どおりに動作しません。出力は、例外が発生したことを示しています。とにかく unittest はテストが失敗したことを通知します:

"C:\Program Files (x86)\Python\python.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) )

誰かが私が間違っていたことを見つけるのを手伝ってもらえますか?

4

1 に答える 1

2

参照: https://wiki.wxpython.org/CppAndPythonSandwich

例外は、C++ レイヤーを介してコール スタックに渡されません。制御が Python から C++ に戻ると、キャッチされなかった Python 例外があったかどうかをチェックし、キャッチされなかった場合は出力してエラーをクリアします。

単体テストでこれに対処する 1 つの方法は、イベント ハンドラーで例外をキャッチし、フラグを設定することです。次に、テストコードに戻り、そのフラグが設定されているかどうかを確認できます。

于 2016-11-08T19:44:13.887 に答える