我希望简单的问题。我有一个函数,它一直提示输入用户输入(字符),并在某些条件下发现输入有效时返回一个字符。我正在为这个和其他类似的函数编写测试,但不知道如何伪造用户输入。顺便说一下,我正在使用scanf()来获取用户输入。
答案 0 :(得分:4)
您可以使用freopen
更改标准输入的行为以从文件中读取。将测试输入放在一个文件中,然后在测试前调用它。
freopen("filename", "r", stdin);
答案 1 :(得分:1)
如果您使用的是unix或cygwin,则可以调用可执行文件并要求它将文本文件用作stdin。例如:
bash$ ./a.out < input_file
答案 2 :(得分:1)
您可以执行类似
的操作 echo -e "Test string\nAnother string" | ./a.out
echo
命令的字符串应该是程序所需的序列
cat test_str_file | ./a.out
文件test_str_file
应包含程序所需序列中的测试字符串
另一方面,您可以简单地用一些虚拟部分替换代码的输入部分。如果您有一个单独的输入模块,则将其替换为虚拟。
答案 3 :(得分:0)
将验证移至另一个功能。并独立测试。或者伪造用户输入重构剩余部分以获取一个函数指针,该函数指针被回调以收集一些字母。这应该是一个简单的假。
我很长时间没有写过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 */
}
答案 4 :(得分:0)
为什么不用默认值调用函数?
答案 5 :(得分:0)
这是一个非常天真的解决方案,但它可能会做你想要的:
char getFakeUserInput()
{
static char* fakeInput = "This is some user input\n";
static int pos = 0;
if(pos >= strlen(fakeInput))
return '\0';
return fakeInput[pos++]
}