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

m_p*_*tor 23 c++ wxwidgets unit-testing googletest

我们需要使用Google Test FrameworkwxWidgets应用程序编写单元测试.问题是wxWidgets使用宏IMPLEMENT_APP(MyApp)来初始化并进入应用程序主循环.这个宏创建了几个函数,包括int main().谷歌测试框架还为每个测试使用宏定义.

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

wxApp* pApp = new MyApp(); 
wxApp::SetInstance(pApp);
wxEntry(argc, argv);
Run Code Online (Sandbox Code Playgroud)

这是一个很好的替代品,但是wxEntry()调用进入原始的应用程序循环.如果我们不调用wxEntry(),仍然有一些应用程序的部分未初始化.

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

Dan*_*ull 12

用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();
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

IMPLEMENT_APP_NO_MAIN(MyApp);
IMPLEMENT_WX_THEME_SUPPORT;

int main(int argc, char *argv[])
{
    wxEntryStart( argc, argv );
    wxTheApp->CallOnInit();
    wxTheApp->OnRun();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


kbl*_*uck 5

您要使用的功能:

bool wxEntryStart(int& argc, wxChar **argv)
Run Code Online (Sandbox Code Playgroud)

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

您可以wxTheApp->CallOnInit()在测试中需要时调用 OnInit()。

你需要使用

void wxEntryCleanup()
Run Code Online (Sandbox Code Playgroud)

当你完成时。