2

UnitTest++ 框架中,Checks.cpp 模块中有 4 个 CheckEqual 的重载版本。每个重载对预期或实际采用不同的常量。然后所有四个都调用 CheckStringsEqual() ,它将 char const* 用于预期和实际。我可以删除重载,一切都编译得很好,但是当使用数组语法声明字符串时,单元测试在传递两个 const 字符串以外的任何内容时都会失败,即

char txt1[]="Hello";

澄清 原始的 UnitTest++ 代码展示了这种行为,而不仅仅是我的实现。此外,当重载被移除时测试失败的事实也让我受阻。

四个重载是:

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 回答