Одна вещь, которую вы могли бы сделать, это просто изменить readStdin
, чтобы он мог либо получать данные из реального стандартного ввода, либо из вспомогательной функции, например:
char *fakeStdIn = "";
int myfgetc (FILE *fin) {
if (*fakeStdIn == '\0')
return fgetc (fin);
return *fakeStdIn++;
}
int readStdin(int limit, char *buffer)
{
char c;
int i = 0;
int read = FALSE;
while ((c = myfgetc(stdin)) != '\n') {
/* if the input string buffer has already reached it maximum
limit, then abandon any other excess characters. */
if (i <= limit) {
*(buffer + i) = c;
i++;
read = TRUE;
}
}
/* clear the remaining elements of the input buffer with a null character. */
for (i = i; i < strlen(buffer); i++) {
*(buffer + i) = '\0';
}
return read;
}
Затем, чтобы вызвать его из вашего юнит-теста, вы можете сделать:
fakeStdIn = "1\npaxdiablo\nnice guy\n";
// Call your top-level input functions like readMenuOption().
Установив ловушку на нижних уровнях, вы можете ввести собственную последовательность символов вместо стандартного ввода. И если в любой момент фальшивый стандартный ввод исчерпан, он возвращается к реальному.
Очевидно, что используются символы, поэтому, если вы хотите внедрить события EOF, вам понадобится массив целых чисел, но это будет незначительной модификацией схемы.