C - Игнорирование ввода пользователя в CUnit?
Я искал ответ, но не нашел. Дело в том, что мне нужно сделать несколько тестовых примеров для программы, которую я написал на C. Дело в том, что некоторые функции принимают пользовательский ввод, что заставляет мои тестовые примеры ждать ввода, а это не то, чего я хочу.
Это один из моих тестовых случаев:
void test_is_location_free() {
Storage test_storage = new_storage();
Item test_item;
test_storage->inventory[5] = test_item;
test_storage->inventory[5].loc.shelf = 'A';
test_storage->inventory[5].loc.place = 1;
CU_ASSERT(!is_location_free(test_storage, test_item, 'A', 1));
}
Это работает, потому что is_location_free() вернет false, но внутри функции у меня есть другая функция, которая будет продолжать запрашивать у пользователя новый ввод, пока выбранное место не освободится.
Вот как это выглядит в терминале, где он будет ждать нового пользовательского ввода для полки:
Suite: HELPER FUNCTIONS
Test: compare_char() ...passed
Test: first_empty_position() ...passed
Test: is_location_free() ...Location not empty, try again!
Shelf:
Есть ли способ полностью игнорировать все пользовательские данные или, возможно, определить будущие пользовательские данные, которые будет использовать мой тест?
Спасибо!
2 ответа
Вы можете легко написать свою собственную версию fgets() для своих модульных тестов. Это называется издевательством и очень распространено в модульном тестировании. Примерно так должно работать:
static char test_input[MAX_INPUT];
char *fgets(char *s, int size, FILE *stream)
{
strncpy(s, test_input, size);
return s;
}
Затем перепишите свой тест, как это:
void test_is_location_free() {
Storage test_storage = new_storage();
Item test_item;
test_storage->inventory[5] = test_item;
test_storage->inventory[5].loc.shelf = 'A';
test_storage->inventory[5].loc.place = 1;
strncpy(test_input, "test input data", MAX_INPUT);
CU_ASSERT(!is_location_free(test_storage, test_item, 'A', 1));
}
Предполагая, что ваш код получает пользовательский ввод из стандартного потока ввода, вы можете записать данные в файл и временно изменить стандартный ввод для чтения из этого файла перед вызовом функции is_location_free.
Я думаю, что та же идея может сработать, если вместо этого пользовательский ввод читается из терминала (/dev/tty), но потребует больше усилий.
Примечание. В этом конкретном случае я бы рекомендовал просто выполнить рефакторинг вашего кода, чтобы функция is_location_free выполняла только то, что предполагает ее имя. Тогда это будет легко проверить. Напишите вторую функцию, чтобы добавить поведение, в котором вы будете запрашивать пользователя, если первое местоположение не работает. Вы можете отказаться от тестов CUnit для этой второй функции.