[Interest] QTest + QSignalSpy doesn't seem to work with deferred signals
Bob Hood
bhood2 at comcast.net
Wed Jan 18 18:16:30 CET 2017
I'm trying to develop a unit test for an deferred signal; i.e. one that won't
be emitted until the event loop has been allowed to run. The case looks like:
void MyTest::user_info_deferred()
{
QVERIFY(qnam_class_ptr != nullptr);
QSignalSpy spy(qnam_class_ptr, &QNAMClass::signal_userInfoReceived);
// Retrieve account user information (deferred)
QCOMPARE(qname_class_ptr->userInfo(), true);
QCOMPARE(spy.count(), 1); // make sure the signal was emitted exactly
one time
QNAMClassUser info = qvariant_cast<QNAMClassUser>(spy.at(0).at(0));
}
I have registered the QNAMClassUser data type, both in the header:
Q_DECLARE_METATYPE(QNAMClassUser)
and in the MyTest::initTestCase() method:
qRegisterMetaType<QNAMClassUser>();
Everything compiles, and the call to userInfo() that initiates the QNAM
request returns true. However, not surprisingly, the signal has not yet been
emitted by the time I hit the next statement that tests the result. (This is
taken directly from the QSignalSpy example in the documentation, btw).
Is QTest capable of testing deferred results--i.e., evaluating tests results
after the even loop has run again--or can only synchronous actions be tested?
I know people have used qWait() and such in the past, or I supposed I could
manually invoke the event loop within the unit test until signals are emitted,
but I was wondering if QTest has been designed to handle that in a canonical
fashion I'm not immediately seeing.
More information about the Interest
mailing list