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

标签 c++ unit-testing wxwidgets googletest

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

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

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

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

问题是如何初始化 wxApp 运行所需的一切,而不实际运行它,以便我们能够对它的部分进行单元测试?

最佳答案

我自己刚刚在 2.8.10 中经历过这个。神奇之处在于:

// MyWxApp derives from wxApp
wxApp::SetInstance( new MyWxApp() );
wxEntryStart( argc, argv );
wxTheApp->CallOnInit();

// you can create top level-windows here or in OnInit()
...
// do your testing here

wxTheApp->OnRun();
wxTheApp->OnExit();
wxEntryCleanup();

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

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

关于c++ - wxWidgets:如何在不使用宏且不进入主应用程序循环的情况下初始化 wxApp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/208373/

相关文章:

c# - 无法加载文件或程序集 - 不能在 asp 上工作,在桌面上工作

c++ - Boost 单元测试编译通过 Eclipse 失败

user-interface - WxWidgets 和现代 opengl (3.3+)

c++ - 无法取消引用 vector 迭代器

c++ - std::tr1::function 和 std::tr1::bind

c++ - Makefile导致编译错误

python - Django TestCase 测试顺序

Python,模拟 : raise exception

macos - 从 wxWidgets 切换到 QT 以移植到 Mac?

c++ - wxScrolledWindow 滚动条不工作