2010-12-02 16 views
3

Je souhaite tester un appareil client/serveur. Le client appelle le serveur, le serveur appelle une fonction de rappel. Quelque chose comme:Comment tester unitairement une fonction de rappel? (C++ Boost Unit test)

void CallBack() 
{ 
    BOOST_SUCCESS(); // test is successful if this is called 
} 

BOOST_AUTO_TEST_CASE(ConnectionTest_ClientCallback) 
{ 
    CallServer(); // server will do work and call CallBack() 
    sleep(20); 
    BOOST_FAIL("Server hasn't called CallBack() within specified time limit."); 
} 

Mais ce qui précède ne fonctionnera pas parce CallBack() pourrait être appelé lors de l'un des tests. Y a-t-il une meilleure manière de faire cela?

Répondre

2

Dans la fonction de rappel définir une variable:

void CallBack() 
{ 
    callBackCalled = true; 
} 

et de test que dans le test:

BOOST_AUTO_TEST_CASE(ConnectionTest_ClientCallback) 
{ 
    callbackCalled = false; 
    CallServer(); // server will do work and call CallBack() 
    sleep(20); 
    if (callbackCalled) 
     BOOST_SUCCESS(); 
    else 
     BOOST_FAIL("Server hasn't called CallBack() within specified time limit."); 
} 

Edit: Une meilleure solution proposée par kizzx2:

BOOST_AUTO_TEST_CASE(ConnectionTest_ClientCallback) 
{ 
    callbackCalled = false; 
    CallServer(); // server will do work and call CallBack() 
    sleep(20); 
    BOOST_CHECK_MESSAGE(callbackCalled, "Server hasn't called CallBack() within specified time limit."); 
} 
+0

Vous avez probablement voulu pour dire 'BOOST_CHECK_MESSAGE (callbackCalled," Le serveur n'a pas appelé CallBack() dans la limite de temps spécifiée. ")' au lieu de 4 lignes? – kizzx2

+0

@ kizzx2: Je n'étais pas au courant - j'amenderai ma réponse. –