Игнорирование пользовательского ввода при тестировании с Unity

#c #unit-testing #unity-test-framework

#c #модульное тестирование #unity-test-framework

Вопрос:

У меня есть программа-чат-бот, которая использует вызываемую функцию userInput() для получения входных данных от пользователя.

Я должен протестировать программу для своего проекта, но я не знаю, как ввести текст в функцию в тестовой программе. Все, что я пробовал, остановило автоматическое тестирование, ожидая, пока пользователь что-то введет.

Любая помощь в добавлении тестовых фраз, которые пользователь сказал бы, не останавливая программу тестирования.

 char *userInput()
{
    char *str = NULL;
    int ch;
    size_t size = 0, len = 0;

    while ((ch=getchar()) != EOF amp;amp; ch != 'n') {
        if (len   1 >= size)
        {
            size = size * 2   1;
            str = realloc(str, sizeof(char)*size);
        }
        str[len  ] = ch;
    }

    if (str != NULL) {
        str[len] = '';
    }

    return str;
}
  

Комментарии:

1. Если я правильно понимаю, что вы хотите сделать, моим лучшим решением было бы прочитать из файла, содержащего кучу тестовых фраз. Если вы не перейдете к потоковой обработке, getchar() всегда будет блокировать выполнение до тех пор, пока оно не сможет прочитать char .

2. Почему буфер (str) увеличивается более чем в два раза быстрее, чем количество вводимых символов?

Ответ №1:

Я придерживался идеи anonmess о том, что вы можете вводить текст от пользователя, используя входной файл. Я использовал входной файл со следующими строками:

 testing input
testing input 2
  

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

 #include <stdio.h>
#include <string.h>

int processInputFile(char *filename)
{
    FILE *ifp;
    char buffer[1024];
    char *p;

    if ((ifp = fopen(filename, "r")) == NULL)
    {
        fprintf(stderr, "Failed to open "%s " in processInputFile.n", filename);
        return -1;
    }

    while ((fgets(buffer, sizeof(buffer), ifp)) != NULL)
    {
        // remove newline character
        p = strchr(buffer, 'n');

        if (p != NULL)
            *p = '';

        // We can also remove the newline character by getting
        // its length and chomping the last character

        // int length = strlen(buffer);
        // buffer[length - 1] = '';

        printf("%sn", buffer);
    }

    fclose(ifp);

}

int main(int argc, char **argv)
{
    if (argc < 2)
    {
        printf("Proper syntax: ./a.out <n>n");
        return -1;
    }

    processInputFile(argv[1]);

    return 0;
}
  

Файл прочитан, и строки напечатаны. Вы можете передать строку другой функции в цикле while.