11

IO 操作を伴う C 関数の単体テストを作成する際に問題に直面しています。たとえば、以下はコンソールからユーザーから入力文字列を取得するために書いたコードです。getchar() 関数を使用してユーザー入力のテストを自動化する方法がわかりません。

char * GetStringFromConsole()
{

    char *strToReturn = NULL;
    int len = 128;

    strToReturn = (char*)malloc(len);
    if (strToReturn) 
    {
        int ch;
        char *ptr  = strToReturn;
        int counter = 0;
        for (; ;) 
        {
            ch = getchar();
            counter++;

            if (counter == len)
            {
                strToReturn = realloc(strToReturn, len*=2 );
                ptr = strToReturn + counter-1;
            }

            if ((ch != EOF) && (ch != '\n') && (counter < len))
            {
                *ptr++ = ch;
            }
            else 
            {
                break;
            }

        }
        *ptr = '\0';
    }
    return strToReturn;
}   
4

1 に答える 1

6

モックgetchar:

  1. テストファイルなどでpreprocessorを使用します。

    #define getchar mock_getchar
    #include "GetStringFromConsole.h"
    ...
    const char* mock_getchar_data_ptr;
    char mock_getchar()
    {
        return *mock_getchar_data_ptr++;
    }
    ...
    // in test function
    mock_getchar_data_ptr = "hello!\n";
    YourAssertEquals("hello", GetStringFromConsole());
    
  2. リンカーの代わりにシンボルを使用します(私の意見では、より困難です)。たとえばgetchar、stdlib にリンクする代わりに、ソース .c ファイルのどこかに独自のシンボルを定義します (例: Windows の msvcrt)。

  3. テスト中の関数を変更して、最良の選択 (IMHO)を返す関数を受け入れるようにします- stdlibcharと競合しません。そして、テスト コードのポイント1のようなものを渡してテストをセットアップします。mock_getchar

    typedef char (*getchartype)();
    char * GetStringFromConsole(getchartype mygetchar)
    {
        ...
        c  = mygetchar()
    

ポイント12getcharについては、 (eg )の代わりに独自の関数を使用することを提案しますmygetchar-この方法では、標準のインクルード/ライブラリとの競合に直面することなく、モック/置換できます。

于 2012-12-28T06:53:22.033 に答える