![](/img/trans.png)
[英]How do I fake a C function that takes a 2D array as input with Fake Function Framework (FFF)?
[英]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.