0

我有一些代码使用 WinAPI 从它的句柄中使用GetWindowTextW和获取窗口的标题和类名GetClassNameW。我想为此代码创建一个单元测试,使用 Qt 创建一个临时窗口,针对它运行我的代码,然后关闭窗口。但是,我不确定如何以简单的方式进行此操作。例如,我可以按如下方式创建窗口:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
QTextEdit textEdit;
textEdit.show();
app.exec(;)
// Rest of my unit test here

然而,此时 QApplication 对象进入它的事件循环并控制我的单元测试,直到我关闭窗口。让我的单元测试继续在窗口上运行的最佳方法是什么?我应该为窗口创建一个单独的线程吗?作为一个单元测试,我想让它尽可能简单。

这个问题旨在独立于单元测试框架,但如果它很重要,我正在使用 UnitTest++。

4

3 回答 3

1

您将无法创建单独的线程,因为所有 Qt gui 对象都必须在主线程中,您只能使用信号/插槽机制与来自其他线程的 gui 对象进行交互。

我认为最简单的方法是继承 QTextEdit,实现公共插槽 UnitTest(),并按如下方式修改您的测试:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
#include "MyTextEdit.h"
#include <QTimer>

int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
my_QTextEdit textEdit;
textEdit.show();
QTimer::singleShot(&my_QTextEdit,SLOT(UnitTest()),0);
app.exec();

在 QApplication 正确实例化并且事件循环正在运行之后,这为您提供了 my_QTextEdit::UnitTest() 的入口点。或者,您可以实现自己的从 QObject 继承的类,创建公共插槽,在运行 app.exec() 之前创建该对象(如果需要,将指针传递给它指向 QTextEdit);并以相同的方式连接到插槽 - 更适合您的需求。

于 2013-01-10T18:02:06.057 回答
0

在我的自动化 Qt 测试中,我通常跳过使用 QApplication::exec 来支持使用QCoreApplication::hasPendingEventsQCoreApplication::processEvents - 这可以让你做一些准备工作,刷新事件队列(所以 Qt 有机会实际显示你的窗口),做更多的工作,让 Qt 处理这引发的任何额外事件,等等;当您想练习小块逻辑时,这是一种非常方便的方法,可以实现所需的细粒度控制。

于 2013-01-10T20:10:21.953 回答
0

这样做的合理工作示例代码在这个相关问题的答案中:Qt event loop and unit testing?

于 2014-04-09T03:01:20.413 回答