как подделать пользовательский ввод в C - PullRequest
2 голосов
/ 25 июля 2011

Простой вопрос, я надеюсь.У меня есть функция, которая продолжает запрашивать пользовательский ввод (символы) и возвращает символ, как только он обнаруживает, что ввод действителен при определенных условиях.Я пишу тесты для этой и других подобных функций, но не знаю, как подделать пользовательский ввод.Кстати, я использую scanf (), чтобы получить пользовательский ввод.

Ответы [ 6 ]

5 голосов
/ 25 июля 2011

Вы можете изменить поведение стандартного ввода для чтения из файла с помощью freopen.Поместите вход теста в файл и вызовите его перед тестом.

freopen("filename", "r", stdin);
1 голос
/ 25 июля 2011

Вы можете сделать что-то вроде

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

Строка команды echo должна быть в той последовательности, которая требуется программе

cat test_str_file | ./a.out

Файл test_str_file должен содержать тестовые строки в последовательности, необходимой программе

С другой стороны, вы можете просто заменить секцию ввода кода на некоторые фиктивные секции.Если у вас есть отдельный модуль для ввода, замените его на фиктивный.

1 голос
/ 25 июля 2011

Если вы работаете в Unix или Cygwin, вы можете вызвать свой исполняемый файл и попросить его использовать текстовый файл в качестве стандартного ввода.Например:

bash$ ./a.out < input_file
0 голосов
/ 25 июля 2011

Это очень наивное решение, но оно может делать то, что вы хотите:

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

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

    return fakeInput[pos++]
}
0 голосов
/ 25 июля 2011

Переместить проверку в другую функцию. И проверить это самостоятельно. Или подделайте пользовательский рефакторинг остатка, чтобы получить указатель на функцию, которая вызывается обратно для сбора некоторых букв. Это должно включить простую подделку.

Я давно не писал 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 и передать в поток символы, подобные этой

STDIN

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 */
}
0 голосов
/ 25 июля 2011

Почему бы просто не вызвать функцию со значением по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...