4

プロジェクトの単体テストに CUnit を使用しています。libc 関数を正しいパラメーターで呼び出しているかどうか、およびその戻り値を正しい方法で処理しているかどうかをテストする必要があります。例: bind(...) 関数を呼び出す場合 - 渡した af パラメータをチェックして、これが間違っている場合はアサートします。また、戻り値をエミュレートし、チェックした場合はアサートします。正しい方法。

これらの目的のために、CUnit環境には、テスト中に「モック」bind()関数を呼び出し、コードを実行するときに実際のbind()関数を呼び出せる組み込みメカニズムがあることを期待しますが、次のようなものは見つかりませんこれ。

CUnit で何か不足しているかどうか教えてください。または、これを実装する方法を提案してください。

ありがとう、ジョー。

4

2 に答える 2

5

残念ながら、CUnit を使用して C の関数をモックすることはできません。

ただし、定義を使用および悪用することで、独自のモック関数を実装できます。テスト用にコンパイルするときに UNITTEST を定義すると仮定すると、テスト済みファイル (またはインクルード) で次のようなものを定義できます。

#ifdef UNITTEST
    #define bind mock_bind
#endif

テストモードでコンパイルする mock_helper.c ファイルで:

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;
}

次に、テストファイルで:

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);
}
于 2011-12-01T09:48:29.983 に答える