2

UnitTest++ フレームワークのChecks.cpp モジュールには、4 つのオーバーロードされたバージョンの CheckEqual があります。各オーバーロードは、expected または actual に対して異なる定数を取ります。次に、4 つすべてが CheckStringsEqual() を呼び出すだけで、予想と実際の両方に char const* を使用します。オーバーロードを削除でき、すべてが正常にコンパイルされますが、文字列が配列構文を使用して宣言されている場合、2 つの const 文字列以外のものが渡されると単体テストが失敗します。

char txt1[]="Hello";

明確化 元の UnitTest++ コードは、私の実装だけでなく、この動作を示します。また、オーバーロードが削除されたときにテストが失敗するという事実も、私を悩ませています。

4 つのオーバーロードは次のとおりです。

void CheckEqual(TestResults& results, 
                char const* expected, 
                char const* actual, 
                TestDetails const& details, 
                std::string const& msg) //msg defaults to ="" in .h
{
    CheckStringsEqual(results, expected, actual, details, msg);
}

void CheckEqual(TestResults& results, 
                char* expected, 
                char* actual, 
                TestDetails const& details)
{
    CheckStringsEqual(results, expected, actual, details);
}

void CheckEqual(TestResults& results, 
                char* expected, 
                char const* actual, 
                TestDetails const& details)
{
    CheckStringsEqual(results, expected, actual, details);
}

void CheckEqual(TestResults& results, 
                char const* expected, 
                char* actual, 
                TestDetails const& details)
{
    CheckStringsEqual(results, expected, actual, details);
}

CheckStringsEqual は

    void CheckStringsEqual(TestResults& results, 
                           char const* expected, 
                           char const* actual,
                           TestDetails const& details, std::string const& msg="")
    {
        using namespace std;

        if (strcmp(expected, actual))
        {
            UnitTest::MemoryOutStream stream;
            stream << msg;
            stream << " Expected " << expected << " but was " << actual;

            results.OnTestFailure(details, stream.GetText());
        }
    }

最後に、最初の CheckEqual 以外をすべてコメントアウトすると失敗するテストをいくつか示します。

char txt1[] = "Hello"; // non-const on purpose so no folding of duplicate data

char txt2[] = "Hello";

TEST(CheckEqualsWithStringsWorksOnContentsNonConstNonConst)  
{
    char const* const p1 = txt1;
    char const* const p2 = txt2;
    TestResults results;
    CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
    CHECK_EQUAL(0, results.GetFailureCount());
}

TEST(CheckEqualsWithStringsWorksOnContentsConstConst) 
{
    char* const p1 = txt1;
    char* const p2 = txt2;
    TestResults results;
    CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
    CHECK_EQUAL(0, results.GetFailureCount());
}

TEST(CheckEqualsWithStringsWorksOnContentsNonConstConst)
{
char* const p1 = txt1;
char const* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}

TEST(CheckEqualsWithStringsWorksOnContentsConstNonConst)
{
char const* const p1 = txt1;
char* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}
4

1 に答える 1

1

最初のCheckEqual関数は追加のパラメーターを取り、デフォルト値はありません。あなたのコードがそのstd::stringパラメーターなしでそれを呼び出しているのがわかります。したがって、コンパイラは、呼び出す関数が見つからないと言うことを期待しています。

同じ数のパラメーターを使用すると、なぜconstそのようにオーバーロードされるのかわかりません。const非変数はいつでも作成できます。const変更しない場合は、これを行う必要があります (CheckStringsEqual変更していません)。

于 2011-03-29T03:06:45.730 に答える