我正在尝试使用 QTestLib 为 GUI 应用程序编写单元测试。问题是其中一个插槽使用 exec()
创建了一个模态对话框。我发现无法与对话框进行交互。
创建对话框的插槽连接到 QAction。所以第一个问题是当我在测试中触发 QAction 时测试会阻塞,因为这会导致调用 exec()
.因此,我尝试创建一个执行交互的 QThread。然而,这并没有帮助。
我已经尝试过的事情(都是在“交互助手”线程中执行的):
QTest::keyClicks()
发送按键点击QCoreApplication::postEvent()
发布 QKeyEventsexec()
才会到达该循环。返回。请参阅下面的编辑 QMetaObject::invokeMethod()
在对话框上调用插槽postEvent()
的原因相同不起作用。请参阅下面的编辑 所以问题是:有没有办法以编程方式与使用
exec()
打开的模态对话框进行交互方法?编辑:实际上,方法3是有效的。问题是另一个问题:
我将参数传递给
invokeMethod()
到“交互助手”线程,由于某种原因,从该线程访问参数不起作用(我没有收到 SEG 错误,但它们只是空的)。我想方法 2 也有效,我只是遇到了与方法 3 相同的问题,但我没有测试。
最佳答案
我在使用用于 GUI 的 Qt 库的命令行应用程序中使用的解决方案是 singleShot
, 如 this answer暗示。在这些情况下,它看起来像这样:
QCoreApplication app(argc, argv);
// ...
QTimer::singleShot(0, &app, SLOT(quit()));
return app.exec();
所以在你的情况下,我想它看起来像这样:
QDialog * p_modalDialog = getThePointer(); // you will have to replace this with
// a real way of getting the pointer
QTimer::singleShot(0, p_modalDialog, SLOT(accept()));
p_modalDialog->exec(); // called somewhere else in your case
// but it will be automatically accepted.
关于unit-testing - 使用 Qt Test 测试模态对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518484/