Как проверить код, который пишет в стандартный вывод?
Как написать тест в CUnit для функции, которая печатает на стандартный вывод, чтобы проверить его вывод?
Пример функции для тестирования:
void print()
{
printf("Hello world");
}
Его модульный тест должен как-то проверить, что "Hello world" был напечатан на консоли:
void test_print()
{
// how to assert?
}
Как я должен идти об этом?
1 ответ
Это должно достичь того, что вы ищете.
(т.е. как сказать, что что-то было написано stdout
)
#include <sys/stat.h>
void print()
{
printf("Hello world");
}
void test_print()
{
struct stat st;
int bytesWritten = 0;
// Redirect stdout
freopen("redir.txt", "w", stdout)
print();
// assert checking
stat("redir.txt", &st);
bytesWritten = st.st_size;
CU_ASSERT( bytesWritten < 0 );
}
Обратите внимание, что это разрушает вашу способность восстанавливать stdout
, но это известная проблема В ссылке они предлагают средство для использования FILE
указатель и использование fprintf()
вместо printf()
stdout
пример перенаправления заимствован отсюда
Проверка размера файла заимствована отсюда
А вот и ссылочная ссылка от CUNIT
И этот ответ SO может предоставить другой способ доступа stdout
не разбивая его через freopen()
, Или этот так ответ, чтобы отменить перенаправление.
Большинство ссылок выше, как правило, относятся к Unix / Linux, но похоже, что аналогичные шаги могут быть предприняты в некоторых версиях Windows.
Эта страница документации по продукту для Win XP предоставляет несколько способов перенаправления или дублирования stdout
через командную строку.
Стоит отметить, что на странице документации XP указано, что одинаковые номера файловых дескрипторов (0, 1, 2) используются для stdin
, stdout
, а также stderr
так freopen()
должен вести себя так же в Windows, как и в Unix / Linux.