代码之家  ›  专栏  ›  技术社区  ›  m_pGladiator

wxwidgets:如何在不使用宏和不进入主应用程序循环的情况下初始化wxapp?

  •  23
  • m_pGladiator  · 技术社区  · 17 年前

    我们需要为 WxWIDGET 应用程序使用 谷歌测试框架 . 问题是 WxWIDGET 使用宏 执行应用程序(myapp) 初始化并进入应用程序主循环。这个宏创建了几个函数,包括 int() . Google测试框架还为每个测试使用宏定义。

    其中一个问题是无法从测试宏内部调用wxwidgets宏,因为第一个宏创建函数。因此,我们发现可以用以下代码替换宏:

    wxApp* pApp = new MyApp(); 
    wxApp::SetInstance(pApp);
    wxEntry(argc, argv);
    

    这是一个很好的替换,但是wxentry()调用进入了原始的应用程序循环。如果我们不调用wxentry(),应用程序的某些部分仍然没有初始化。

    问题是如何初始化运行wxapp所需的所有内容,而不实际运行它,因此我们能够对其部分进行单元测试?

    6 回复  |  直到 12 年前
        1
  •  3
  •   kbluck    17 年前

    要使用函数:

    bool wxEntryStart(int& argc, wxChar **argv)
    

    而不是WXentry。它不会调用应用程序的OnInit()或运行主循环。

    你可以打电话 wxTheApp->CallOnInit() 在测试中需要时调用OnInit()。

    你需要使用

    void wxEntryCleanup()
    

    完成后。

        2
  •  12
  •   Daniel Paull    16 年前

    我刚刚通过了2.8.10。神奇之处在于:

    // MyWxApp derives from wxApp
    wxApp::SetInstance( new MyWxApp() );
    wxEntryStart( argc, argv );
    wxTheApp->OnInit();
    
    // you can create top level-windows here or in OnInit()
    ...
    // do your testing here
    
    wxTheApp->OnRun();
    wxTheApp->OnExit();
    wxEntryCleanup();
    

    您可以创建一个wxapp实例,而不是使用上面的技术派生自己的类。

    我不确定您希望如何在不进入主循环的情况下对应用程序进行单元测试,因为许多WXWidgets组件需要传递事件才能正常工作。通常的方法是在进入主循环之后运行单元测试。

        3
  •  4
  •   Byllgrim    12 年前
    IMPLEMENT_APP_NO_MAIN(MyApp);
    IMPLEMENT_WX_THEME_SUPPORT;
    
    int main(int argc, char *argv[])
    {
        wxEntryStart( argc, argv );
        wxTheApp->CallOnInit();
        wxTheApp->OnRun();
    
        return 0;
    }
    
        4
  •  1
  •   W Semmelink    14 年前

    看起来在wxapp::onrun()函数中进行测试可能有效。 下面是用cppunitlite2测试对话框标题的代码。

     
    #include "wx/wxprec.h"
    
    #ifdef __BORLANDC__
    #pragma hdrstop
    #endif
    
    #ifndef WX_PRECOMP
        #include "wx/wx.h"
    #endif
    #include  "wx/app.h"  // use square braces for wx includes: I made quotes to overcome issue in HTML render
    #include  "wx/Frame.h"
    #include "../CppUnitLite2\src/CppUnitLite2.h"
    #include "../CppUnitLite2\src/TestResultStdErr.h" 
    #include "../theAppToBeTested/MyDialog.h"
     TEST (MyFirstTest)
    {
        // The "Hello World" of the test system
        int a = 102;
        CHECK_EQUAL (102, a);
    }
    
     TEST (MySecondTest)
     {
        MyDialog dlg(NULL);   // instantiate a class derived from wxDialog
        CHECK_EQUAL ("HELLO", dlg.GetTitle()); // Expecting this to fail: title should be "MY DIALOG" 
     }
    
    class MyApp: public wxApp
    {
    public:
        virtual bool OnInit();
        virtual int OnRun();
    };
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {   
        return true;
    }
    
    int MyApp::OnRun()
    {
        fprintf(stderr, "====================== Running App Unit Tests =============================\n");
        if ( !wxApp::OnInit() )
            return false;
    
        TestResultStdErr result;
        TestRegistry::Instance().Run(result);   
        fprintf(stderr, "====================== Testing end: %ld errors =============================\n", result.FailureCount() );
    
        return result.FailureCount(); 
    }
    
        5
  •  -1
  •   Ber    17 年前

    你可以扭转局面:

    初始化并启动wxpython应用程序,包括主循环,然后从应用程序内部运行单元测试。我认为在完成所有init操作之后,有一个对主循环条目调用的函数。

        6
  •  -1
  •   antik    17 年前

    你试过了吗 IMPLEMENT_APP_NO_MAIN 宏?宏定义上面提供的注释表明它可能会做您需要它做的事情。

    从<wxwidgets'源目录\include\wx.h:

    // Use this macro if you want to define your own main() or WinMain() function
    // and call wxEntry() from there.
    #define IMPLEMENT_APP_NO_MAIN(appname)                                      \
       wxAppConsole *wxCreateApp()                                             \
        {                                                                       \
            wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE,         \
                                            "your program");                    \
            return new appname;                                                 \
        }                                                                       \
        wxAppInitializer                                                        \
            wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp);        \
        DECLARE_APP(appname)                                                    \
        appname& wxGetApp() { return *wx_static_cast(appname*, wxApp::GetInstance()); }