unit-testing - 使用 Qt Test 测试模态对话框

标签 unit-testing qt modal-dialog

我正在尝试使用 QTestLib 为 GUI 应用程序编写单元测试。问题是其中一个插槽使用 exec() 创建了一个模态对话框。我发现无法与对话框进行交互。

创建对话框的插槽连接到 QAction。所以第一个问题是当我在测试中触发 QAction 时测试会阻塞,因为这会导致调用 exec() .因此,我尝试创建一个执行交互的 QThread。然而,这并没有帮助。

我已经尝试过的事情(都是在“交互助手”线程中执行的):

  • 使用 QTest::keyClicks() 发送按键点击
  • 导致错误消息“QCoreApplication::sendEvent():无法将事件发送到不同线程拥有的对象”
  • 使用 QCoreApplication::postEvent() 发布 QKeyEvents
  • 不起作用,即没有任何 react 。我猜是因为事件最终在拥有对话框的线程的事件循环中结束,直到对话框关闭和 exec() 才会到达该循环。返回。请参阅下面的编辑
  • 使用 QMetaObject::invokeMethod() 在对话框上调用插槽
  • 不起作用,即没有任何 react 。我想与 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/

    相关文章:

    unit-testing - 有没有办法定义两个不同 Testng Listener 的运行顺序?

    linux - 为什么我不能在分辨率为 800x600 的显示器上运行 Qt Qml 应用程序?

    qt - 没有什么可以帮助解决 Qt 中的 "Undefined reference to vtable"

    javascript - Bootstrap Modal 在不被查看或关闭的情况下立即消失

    delphi - 如何防止快捷方式在Delphi中碰撞/交互?

    javascript - 单击模态框时按钮没有被触发

    python-3.x - 如何在 python 中正确模拟 gcp 客户端库调用

    python - 无法运行 openstack nova 的单元测试

    javascript - 在 Windows 中查看 LCOV 文件

    javascript - 如何在 C++ 中创建对象并在 QML 中访问它