簡體   English   中英

如何在C中偽造用戶輸入

[英]how to fake user input in C

我希望這個簡單的問題。 我有一個函數,不斷提示用戶輸入(字符),並在發現輸入在特定條件下有效后返回一個字符。 我正在為此和其他類似功能編寫測試,但不知道如何偽造用戶輸入。 順便說一句,我正在使用scanf()獲取用戶輸入。

您可以使用freopen更改標准輸入的行為以從文件讀取。 將測試輸入放置在文件中,並在測試之前調用它。

freopen("filename", "r", stdin);

如果您使用的是Unix或cygwin,則可以調用可執行文件,並要求其使用文本文件作為stdin。 例如:

bash$ ./a.out < input_file

你可以做點什么

echo -e "Test string\\nAnother string" | ./a.out

echo命令的字符串應按程序要求的順序

cat test_str_file | ./a.out

文件test_str_file應按程序要求的順序包含測試字符串

另一方面,您可以簡單地用一些虛擬部分替換代碼的輸入部分。 如果您有用於輸入的單獨模塊,則用虛擬模塊替換它。

將驗證移至另一個功能。 並獨立測試。 或偽造用戶輸入,重構其余部分以獲取一個函數指針,該函數指針被調用以收集一些字母。 那應該可以進行簡單的偽造。

我已經很長時間沒有寫C了,但是類似的東西也可以工作

/* test this independentaly */
int isvalid(char* chars){ 
  /* do stuff and return result */
}

/*real function */
char* getinput() {
  scanf(....)
  return stuff_from_scanf;
}



/*fake/mock function */
char* getinputFake(char * testString) {
   return testString;
}


test() {
 int result = isvalue(getinputFake("test data"));
 /* rest of test */
}

您無需測試scanf函數,但可以將其替換為fscanf,並使用如下所示的字符傳遞流

標准輸入

char* getinput(FILE * stream) {
   fscanf(stream....)
   return stuff_from_fscanf;
}


test() {
 FILE * stream = .....; /*create a dummy stream say from */
 int result = isvalue(getinput(stream);
 /* rest of test */
}

為什么不只使用默認值調用該函數?

這是一個非常幼稚的解決方案,但是它可以滿足您的要求:

char getFakeUserInput()
{
    static char* fakeInput = "This is some user input\n";
    static int pos = 0;

    if(pos >= strlen(fakeInput))
        return '\0';

    return fakeInput[pos++]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM