c - 如何为另一个使用 stdin 输入的函数编写测试函数?

标签 c unit-testing stdin

作为大学作业的一部分,我具有以下功能:

int readMenuOption()
{
   /* local declarations */
   char option[2];
   /* read in 1 char from stdin plus 1 char for string termination character */
   readStdin(1 + 1, option);
   return (int)option[0] <= ASCII_OFFSET ? 0 : (int)option[0] - ASCII_OFFSET;
}

int readStdin(int limit, char *buffer) 
{
   char c;
   int i = 0;
   int read = FALSE;
   while ((c = fgetc(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;
}

它非常适合我需要它做的事情(从键盘接收输入)。由于我的教授概述了一些要求,我不得不使用 stdin(就像我一样)来完成它。

我想为作业编写一系列“单元测试”,但我不知道如何让我的测试函数调用 readMenuOption() 并将输入传递给它(无需在运行时执行)。

这可能吗?如果可以,我该怎么做? (即,是否可以写入标准输入)?

最佳答案

可以做的一件事是简单地修改 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().

通过在较低级别放置一个钩子(Hook),您可以注入(inject)您自己的字符序列而不是使用标准输入。如果在任何时候,假标准输入用完了,它就会恢复为真实输入。

显然,这是使用字符,因此,如果您想注入(inject) EOF 事件,您将需要一个整数数组来代替,但这将是对该方案的一个小修改。

关于c - 如何为另一个使用 stdin 输入的函数编写测试函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5740176/

相关文章:

ruby - 如何避免过度测试私有(private)方法的行为?

python - csh 标准输入到 Python 标准输入?

c - 读取二进制文件C编程

java - 如何跟踪 junit 测试中的值?

visual-studio - 在 Visual Studio 2008 中生成自定义测试结果

c - sscanf - 获取句子中的第 n 个单词

c - 在 c 中重新分配 char ** 的内存

c - 在c中用指针参数传递函数指针

无法通过 'error: missing braces around initializer'