我有一些代码使用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 ++。
答案 0 :(得分: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);并以相同的方式连接到插槽 - 更好地满足您的需求。
答案 1 :(得分:0)
在我的自动Qt测试中,我通常跳过使用QApplication :: exec而不是使用QCoreApplication::hasPendingEvents和QCoreApplication::processEvents - 这可以让你做一些准备工作,刷新事件队列(所以Qt有机会真正展示你的窗口),做更多的工作,让Qt处理这个抛出的任何其他事件,等等;当你想要运用小块逻辑时,它是一种非常方便的方法,可以实现所需的细粒度控制。
答案 2 :(得分:0)
这样做的合理工作示例代码就是在这个相关问题的答案中:Qt event loop and unit testing?