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.
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to