在c++中创建未命名容器,以便在单元测试中进行临时比较

Making unnamed container in c++ for temporary comparison in unit test

本文关键字:比较 单元测试 创建 c++ 命名容器      更新时间:2023-10-16

在c++的单元测试代码中,当我需要比较两个向量时,我创建临时向量来存储期望值。

std::vector<int> expected({5,2,3, 15});
EXPECT_TRUE(Util::sameTwoVectors(result, expected));

我能把它写成一行吗?在python中,我可以用"[…]"生成一个列表。

sameTwoVectors(members, [5,2,3,15])

由于std::vector包含一个初始化列表构造函数,它接受一个std::initializer_list,只要sameTwoVectors函数接受一个vector by value,右值引用或const引用,就可以使用统一的初始化语法。

namespace Util
{
    bool sameTwoVectors(
        const std::vector<int>& result,
        const std::vector<int>& expected)
        {
            return result == expected;
        }
}

int main()
{
    std::vector<int> result;
    EXPECT_TRUE(Util::sameTwoVectors(result, {5,2,3,15}));
}

可选地,如果sameTwoVectors只做一个简单的比较,您可以消除它。当调用EXPECT_TRUE时,只需在其位置使用比较表达式。这样做的代价是必须显式地指定std::vector<int>,而不是依赖隐式转换构造函数。这比预期的结果少了几个字符,也更清楚了一点。

EXPECT_TRUE(result == std::vector<int>({5,2,3,15}));

如果Util::sameTwoVectors需要const引用或只是一个值,您可以(假设c++ 11支持)这样写

EXPECT_TRUE(Util::sameTwoVectors(result, std::vector<int>{5, 2, 3, 15}));