それっぽいテストができるようになりましたが、方法がシックリきていません…。
マサカリが投げ込まれることを、心より望んでおります。
やりたいこと
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()でタイムアウトするようになってしまいました…。
うーむ…。