gpt4 book ai didi

c++ - Qt 插槽测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:50 25 4
gpt4 key购买 nike

我正在为 Qt5 GUI 应用编写一些测试用例。我用 QObject::findChild检查元素是否存在和QSignalSpy检查其信号是否使用正确的参数调用。现在我想检查信号是否连接到正确的插槽,但我不知道该怎么做。我本以为这是一些相当标准的事情,但我在网上找不到任何相关信息。

我在附录中放了一个小的演示应用程序来解释我想要什么。它仅由主窗口中的 slider 和找到并更改 slider 的测试用例组成。我想继续测试是否w.doSomething(10)被叫了,我想检查是否 slider->valueChanged(10)是来电者。

我基本上看到了三种可能的方法:

  1. 使用我尚未找到的标准 Qt 测试工具/最佳实践。 (任何提示表示赞赏。)

  2. 找到Qt 存储连接的表sender->*signalreceiver->*slot并验证(稍微滥用语法)

    sender == slider && signal == &QSlider::valueChanged;
    receiver == &w && slot == &MainWindow::doSomething;
  3. MainWindow::doSomething(int)写一个包装器上面写着:

    void doSomething(int value) {
    slotCallTable << this << "MainWindow::doSomething(int)" << value;
    doSomething_nowReally(value);
    }

    哪里slotCallTableTest::test() 中记录我希望以某种方式验证的调用.在那里我想检查接收者是否是正确的对象。但我认为我无法通过这种方式验证发件人(不会是一个大问题)。

谁能告诉我 (1) 是否存在,(2) 是否可能/合理,或者是否有人已经做过类似 (3) 的事情,我不必从零开始?

请注意,我有我正在测试的应用程序的代码,但我无法手动修改它,因为测试必须是自动可重现的,并且测试代码不应进入主要开发代码库。但是,代码的可编程更改是可以的,只要它们是(稳健地)可重现的。

感谢您阅读所有长篇文章,如果您能(并且确实)回答我的一些问题,真的非常感谢。

干杯
混音

附录(工作示例):

// window.h:

#include <QObject>
#include <QMainWindow>
#include <QSlider>

class MainWindow : public QMainWindow {
Q_OBJECT

private:
QSlider * slider;

private slots:
void doSomething(int value) {}

public:
MainWindow(QWidget * parent = nullptr) : QMainWindow(parent) {
slider = new QSlider(Qt::Orientation::Horizontal, this);
slider->setObjectName("slider");
QObject::connect(slider, SIGNAL(valueChanged(int)),
this, SLOT(doSomething(int)));
this->show();
}

~MainWindow() { delete slider; }
};

// test.h:

#include <QtTest>
#include "window.h"

class Test : public QObject {
Q_OBJECT

private:
MainWindow w;

private slots:
void test() {
QSlider * slider = w.findChild<QSlider *>("slider");
QVERIFY(slider != nullptr); // slider exists

QSignalSpy spy(slider, SIGNAL(valueChanged(int)));
QCOMPARE(spy.isValid(), true); // signal exists
// note: of course it exists here, but this
// would be a custom signal in real

slider->setValue(10); // fire some signal

QCOMPARE(spy.count(), 1); // fired exactly once
QCOMPARE(spy.takeFirst().at(0).toInt(), 10); // with right arguments

QVERIFY("how to test right slot was triggered ???" && false);
}
};

// main.cc:

#include "test.h"
QTEST_MAIN(Test)

最佳答案

如果您想对连接进行单元测试,可以使用 connect()最后一个参数为 Qt::UniqueConnection

将测试线更改为:

QVERIFY( false == QObject::connect(slider, SIGNAL(valueChanged(int)), &w, SLOT(doSomething(int)), Qt::UniqueConnection)  );

如果连接不存在,则 connect() 返回 true

但是,请注意无法检查多个连接(多次创建相同的连接)。

关于c++ - Qt 插槽测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com