#c #unit-testing #printing #void
Вопрос:
Я пытаюсь написать модульный тест для кода на C с помощью check. Тем не менее, я наткнулся на тесты для методов void без операторов return, которые используют только printf(). Как я могу проверить результат этих методов? Есть ли какой-либо способ перенаправить вывод на массив символов, которые я могу сравнить? Я нашел несколько ответов для Python, но ни одного для C.
Ответ №1:
Может быть, попробовать freopen()
?
// untested, no guarantees
START_TEST(test_silentfunction) {
// redirect stdout to file
freopen("/tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt", "w", stdout);
silentfunction();
// return stdout to default tty output
freopen("/dev/tty", "w", stdout);
// check contents of file /tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt
remove("/tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt");
}
END_TEST
Комментарии:
1. Если бы кто-то хотел восстановить
stdout
то, что было раньше (в случае, если это было не"/dev/tty"
так), какие-нибудь идеи?2. Поскольку
stdout
имеет файловый дескриптор1
, можно использовать этот фрагмент кода, чтобы узнать, чтоstdout
такое перед использованиемfreopen()
:int get_stdout_filepath(char* output, size_t output_size) { ssize_t res = readlink("/proc/self/fd/1", output, output_size); return (res > 0 amp;amp; res < (ssize_t) output_size) ? 1 : 0; }
. Этот код не является переносимым (требуется<unistd.h>
иreadlink()
функционирует) и возвращается1
при успешном выполнении и0
при сбое.