Как проверить код, который пишет в стандартный вывод?

Как написать тест в 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.

Другие вопросы по тегам