それっぽいテストができるようになりましたが、方法がシックリきていません…。
マサカリが投げ込まれることを、心より望んでおります。
やりたいこと
UDPでデータを受信できることをテストしたいです。
テスティングフレームワークにはgoogletestを使用します。
  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);
    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);
    // recieverにデータが届いたことをテストする
  }
とりあえずできたこと
recieverにデータが届くと、readReadyシグナルを受信できることをテストできました。
実装は次の通り。
【main.cpp】
main()内でQCoreApplicationを初期化し、Event loopを作成できるようにします。
# include <gtest/gtest.h>
# include <QCoreApplication>
int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
【UdpRecieverTest.cpp】
(1) QtテスティングフレームワークのQSignalSpyを使って、recieverのreadyRead()をスパイします。
(2) spy.wait()でEvent loopを開始し、シグナルをキャッチした(trueが返る)ことをテストします。
(3) spy.count()で、シグナルをちょうど1回キャッチしたことをテストします。
  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);
    QSignalSpy spy(&reciever, SIGNAL(readyRead())); // (1)
    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);
    EXPECT_TRUE(spy.wait(1000)); // (2)
    EXPECT_EQ(1, spy.count()); // (3)
  }
このテストはパスします。
気になっている点
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);
// ↑
// この間にreadyRead()シグナルが発生すると、wait()がtimeoutするのでは?
// ↓
    EXPECT_TRUE(spy.wait(1000));
本当はこうするべき?
spyを別スレッドに移して、wait()かけてから、writeDatagram()を呼べば良い気がしますが、
wait()でタイムアウトするようになってしまいました…。
うーむ…。