9

出力を検証するために、stdoutに出力する関数の CUnit でテストを作成する方法は?

テストする関数の例:

void print()
{
    printf("Hello world");
}

その単体テストは、「Hello world」がコンソールに出力されたことを何らかの方法で確認する必要があります。

void test_print()
{
    // how to assert?
}

どうすればいいですか?

4

1 に答える 1

18

これはあなたが探しているものを達成するはずです。
(つまり、何かが に書き込まれたことを伝える方法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()。または、この SO の回答でリダイレクトを元に戻します。


上記のリンクのほとんどは一般的に Unix / Linux 固有のものですが、一部のバージョンの Windows でも同様の手順を実行できるようです。

この Win XP の製品ドキュメント ページでstdoutは、コマンド ラインからリダイレクトまたは複製する方法をいくつか説明しています。

XP のドキュメント ページでは、 、 には同じファイル記述子番号 (0、1、2) が使用されているためstdin、Windows でも Unix / Linux と同じように動作するはずであるstdoutと指摘されていることに注意してください。stderrfreopen()

于 2014-10-01T17:27:52.727 に答える