2015-11-17 1 views
1

J'ai eu EXPECT_CALL en passant sur mes tests, jusqu'à ce que j'ajoute un en-tête pour envelopper le unsigned char * je testais. Je comprends que le test tombe, car ce n'est pas le même unsigned char * que prévu. Je ne suis pas sûr de savoir comment redessiner mes tests, donc le unsigned char * assigné à fait passer le test.Comment résoudre l'échec gmock EXPECT_CALL, lorsque la variable passée à la fonction n'a pas d'importance

Mon test (avec initialisation des variables à l'écart):

EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize)); 

packetManager.Update(0.01f); 
packetManager.Send(packetData, dataSize); 

La fonction en cours de test:

void PacketManager::Send(unsigned char *packetData, int packetSize) 
{ 
    if(this->secondSinceLastUpdate <= 1.0f) 
     packetsSent++; 
    else 
    { 
     packetsSent = 0; 
     this->secondSinceLastUpdate = 0.0f; 
    } 

    std::stringstream convert; 
    convert << htonl((uint32_t)packetSize); 
    Header *header = new Header; 
    header->name = "PKT_" + convert.str(); 
    header->packetSize = packetSize; 
    header->packetData = packetData; 
    unsigned char * pktHeader = new unsigned char[sizeof(Header)]; 
    pktHeader = (unsigned char*)header; 
    PKT_Header = pktHeader; // tried assigning to public variable, 
          // but would be assigned to after EXPECT_CALL is setup. 
    int totalPacketSize = packetSize; // rewrite to loop through que 
    if(header->packetSize <= 800 && totalPacketSize <= 1024 && packetsSent <= 30) 
     networkConnection->Transmit(pktHeader, packetSize); 
} 

sortie gmock:

[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from PacketManager 
[ RUN  ] PacketManager.SendsPacketsUnder1024 
unknown file: Failure 

Unexpected mock function call - returning directly. 
    Function call: Transmit(0x2096c10, 100) 
Google Mock tried the following 1 expectation, but it didn't match: 

/home/zerophase/ClionProjects/PacketManager/tests/basic_tests/basic_check.cpp:20: EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize))... 
    Expected arg #0: is equal to 0x2096560 
      Actual: 0x2096c10 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
/home/zerophase/ClionProjects/PacketManager/tests/basic_tests/basic_check.cpp:20: Failure 
Actual function call count doesn't match EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize))... 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
[ FAILED ] PacketManager.SendsPacketsUnder1024 (0 ms) 
[----------] 1 test from PacketManager (0 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (0 ms total) 
[ PASSED ] 0 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] PacketManager.SendsPacketsUnder1024 

Est-EXPECT_CALL encore ce que je veux utiliser pour tester Transmit étant appelé?

+0

Veuillez inclure la sortie appropriée de google mock. –

+0

@ AntonioPérez J'ai ajouté la sortie gmock. – ZeroPhase

Répondre

1

Si le paramètre exact transmis à Transmit ne vous intéresse pas vraiment, vous pouvez utiliser le mot-clé _.

EXPECT_CALL(networkConnectionMock, Transmit(_, dataSize)); 

Si vous souciez le paramètre exact alors je réorganiser mon code légèrement de sorte qu'au lieu de passer dans une unsigned char* brute en Send, je voudrais créer une classe simple qui fait le travail que vous faites dans Send et que cette classe soit responsable de renvoyer un unsigned char*.

De cette façon, vous pouvez passer un objet fantaisie dans votre méthode Send qui vous donne plus de contrôle sur les paramètres passés en Trasmit.

+0

Merci, ce serait le plus logique pour le développement du code. Je n'ai pas vraiment pensé à faire ça. Je pense que je vais juste devoir le convertir en un char non signé * pour passer la méthode à envoyer. – ZeroPhase

0

Vous essayez de faire correspondre l'appel à Transmit avec packetData comme premier paramètre, mais l'appel étant fait en PacketManager::Send est pour pktHeader, qui est une (fuite) variable locale. Le simulacre signale correctement l'appel de fonction sans correspondance et doit également signaler un avertissement pour appeler la fonction sans intérêt.