gpt4 book ai didi

c++ - 当QTest::qWait(...)成功时,QSignalSpy::wait(...)失败

转载 作者:行者123 更新时间:2023-12-01 14:44:25 26 4
gpt4 key购买 nike

我处于一种令人困惑的情况。在测试QStateMachine的状态转换时,以下代码无法使窥探导致转换的信号。

// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));

// emmit StateChanged signal
test_obj_->SetState(SS_STARTING);
// Current state property should be SS_STARTING
QVERIFY(spy.wait()); //<--- fails test
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

以下代码通过了测试!
// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));

// emmit StateChanged signal
test_obj_->SetState(SS_STARTING);
// Current state property should be SS_STARTING
QTest::qWait(20); //<--- passes test
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

我还可以从外部验证使用dbus-monitor发出的信号。

我可以继续使用QTest::qWait,这没什么大不了的,但是我对为什么spy.wait无法正常工作感到困惑。

干杯,
西蒙

最佳答案

您的测试不正确,一旦您设置了setState(),信号就会发出,因此spy.wait()将不再接收该信号。因此,想法是在spy.wait()开始使用QTimer之后的片刻内发出信号:

// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));
// emmit StateChanged signal
// test_obj_->SetState(SS_STARTING);
QTimer::singleShot(0, [test_obj_](){ test_obj_->setState(SS_STARTING);}); // <----
QVERIFY(spy.wait());
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

在第二个示例中,不需要 QTest::qWait(),因为状态会同步更改

关于c++ - 当QTest::qWait(...)成功时,QSignalSpy::wait(...)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095175/

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