Domanda

Sto usando CUnit per il mio test di unità di progetto. Ho bisogno di verificare se io chiamo funzioni libc con i giusti parametri e se mi trattano il loro ritorno i valori nel modo giusto. per esempio: se io chiamo il bind (...) la funzione - Vorrei verificare quali af param passo & assert se questo è quello sbagliato, e anche io vorrei emulare il suo valore di ritorno & assert se lo controllo la strada giusta.

A tal fine mi aspetterei l'ambiente CUnit di avere un meccanismo incorporato per farmi chiamare una funzione 'deriso' bind () durante il test e un vero e proprio bind () funzione quando l'esecuzione del codice - ma non posso trovare nulla di simile.

Può cortesemente dirmi se mi manca qualcosa a Cunit, o forse suggerire un modo per implementare questo.

Grazie, Jo.

È stato utile?

Soluzione

Purtroppo, è possibile funzioni non finti in C con CUnit.

Ma è possibile implementare le proprie funzioni finte usando e abusando di definisce: Supponendo che si definiscono unittest durante la compilazione per i test, è possibile nel file testata (o in un includono) definire qualcosa di simile:

#ifdef UNITTEST
    #define bind mock_bind
#endif

In un file mock_helper.c che si compila in modalità di test:

static int mock_bind_return;    // maybe a more complete struct would be usefull here
static int mock_bind_sockfd;

int mock_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    CU_ASSERT_EQUAL(sockfd, mock_bind_sockfd);
    return mock_bind_return;
}

Poi, nel file di test:

extern int mock_bind_return;
extern int mock_bind_sockfd;

void test_function_with_bind(void)
{

   mock_bind_return = 0;
   mock_bind_sockfd = 5;
   function_using_bind(mock_bind_sockfd);
}

Altri suggerimenti

glibcmock è una soluzione di scherno funzione libc con Google prova . per esempio:

#include "got_hook.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include <sys/socket.h>

#include <mutex>
#include <memory>

struct MockBind {
    MOCK_METHOD3(Bind, int(int, const struct sockaddr*, socklen_t));
};

static MockBind *g_mock{nullptr};

static int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
    return g_mock->Bind(sockfd, addr, addrlen);
}

static std::mutex g_test_mutex;

TEST(BindTest, MockSample) {
    std::lock_guard<std::mutex> lock(g_test_mutex);
    std::unique_ptr<MockBind> mock(g_mock = new MockBind());
    testing::GotHook got_hook;
    ASSERT_NO_FATAL_FAILURE(got_hook.MockFunction("bind", (void*)&Bind));
    // ... do your test here, for example:
    struct sockaddr* addr = nullptr;
    EXPECT_CALL(*g_mock, Bind(1, addr, 20)).WillOnce(testing::Return(0));
    EXPECT_EQ(0, bind(1, addr, 20));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top