c ++ - Hvordan kunne jeg bruge google test på Windows-applikation baseret på meddelelseskø?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil bruge google test til mit program, der har timerfunktionalitet inde.
Timeren implementeres af Windows SetTimer (), og der er en meddelelseskø i hovedmenuen () for at behandle timeout-meddelelsen.


while (GetMessage(&msg, NULL, 0, 0)) {
    if (msg.message == WM\_TIMER) {
        ...
    }
    DispatchMessage(&msg);
}


For google-testen kalder det RUN\_ALL\_TESTS () for at starte testen.


int main( int argc , char *argv[] )
{
    testing::InitGoogleTest( &argc , argv );
    return RUN\_ALL\_TESTS();
}


Mit spørgsmål er, hvordan kunne jeg integrere disse to dele. Fordi en del af min kode vil sende en besked, skal jeg have den samme meddelelseskø mekanisme til at håndtere det.


Betyder det, at jeg skal skrive beskeden køen håndtering i hver test sag? Er det en brugbar metode?


TEST()
{
    ... message queue here ...
}


Er der nogen ordentlig metode til at gøre denne type test?
Tak allesammen.

Bedste reference


Det ser ud til, at koden, du vil teste, er afhængig af en meddelelseskømekanisme. Du kan forbedre testbarheden, hvis du implementerer en abstrakt meddelelseshåndteringsklasse som denne, der bliver injiceret i hver klasse, der skal sende en besked:


class MessageHandler
{
  virtual void DispatchMessage(Msg messageToBeDispatched) = 0;
}


Nu kan du implementere forskellige meddelelseshåndteringsmaskiner til produktiv og til testformål:


class TestMessageHandler : public MessageHandler
{
  void DispatchMessage(Msg messageToBeDispatched)
  {
     // Just testing, do nothing with this message, or just cout...
  }
}

class ProductiveMessageHandler : public MessageHandler
{
  void DispatchMessage(Msg messageToBeDispatched)
  {
     // Now do the real thing
  }
}


I din kode kan du nu injicere enten en 'ProductiveMessageHandler' eller en 'TestMessageHandler', eller du kan endda bruge en mocked test handler ved hjælp af GoogleMock for at teste forventninger.


class MyProductionCode
{
   MyProductionCode(MessageHandler *useThisInjectedMessageHandler);
}


Din testkode ser sådan ut:


class TestMyProductionCode : public ::testing::Test
{
  TestMessageHandler myTestMessageHandler;
}

TEST(TestMyProductionCode, ExampleTest)
{
  MyProductionCode myTestClass(&myTestMessageHandler);

  ASSERT\_TRUE(myTestClass.myTestFunction());
}