c++ 如何使用google tests的容器匹配器来检查容器中是否存在ValueObjects?

i1icjdpr  于 2023-04-08  发布在  Go
关注(0)|答案(2)|浏览(100)

我在C#中有一个练习,我试图将其翻译成C++。我想有一些谷歌测试使用匹配器来检查集合内容,就像我在C#中一样。容器中的元素是一个用户定义的ValueObject,它实现了==运算符,因此具有相同数据的对象是相等的。
它不工作,我不知道为什么?
这就是我想写的:

std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");
    ASSERT_THAT(charactersList, testing::Contains(*std::make_unique<Character>("Nancy", "Wheeler")));
    ASSERT_THAT(charactersList, testing::ElementsAre(
            *std::make_unique<Character>("Nancy", "Wheeler"),
            *std::make_unique<Character>("Mike", "Wheeler"),
            *std::make_unique<Character>("Karen", "Wheeler")
    ));

这是一个片段从:https://github.com/emilybache/StrangeCharacter-TestDesign-Kata/blob/main/cpp/test-gtest/ExampleCharacterTestCase.cpp
这是C#版本的工作:

CollectionAssert.Contains(charactersList, new Character("Nancy", "Wheeler"));
    CollectionAssert.AreEquivalent(new List<Character>()
    {
        new Character("Nancy", "Wheeler"),
        new Character("Mike", "Wheeler"),
        new Character("Karen", "Wheeler"),
    }, charactersList);

这是一个片段从:https://github.com/emilybache/StrangeCharacter-TestDesign-Kata/blob/main/csharp/StrangeCharacters/TestCharacters/ExampleCharacterTestCase.cs

toiithl6

toiithl61#

问题似乎是你不理解C++中指针的工作方式。来自C#背景,这并不奇怪。
这个

std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");

operator==是一个指针向量。对于Characteroperator==的重载不会帮助您找到Character指针。
由于不可能为指针重载operator==,我建议您要么更改代码以使用Characters(即std::vector<Character> charactersList = ...)的向量,或者如果不可能,则使用不同的技术来查找向量中的指针是否指向特定字符。
正如评论中已经指出的

*std::make_unique<Character>("Nancy", "Wheeler")

是一种完全被误导的说法

Character("Nancy", "Wheeler")

你不能把C当作C#的一个小变体来编程。这两种语言非常非常不同。在C#中,你通常用new创建对象。在C中,你很少用new创建对象。

hvvq6cgz

hvvq6cgz2#

给你

std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");

你有指针的向量。

ASSERT_THAT(charactersList, testing::Contains(*std::make_unique<Character>("Nancy", "Wheeler")));

在这里,你试图将数组的元素(指针)与一个值进行比较,这对于使用C#的人来说是可以理解的。在C++中,这种类型是不可比较的。你知道指针并添加了这个疯狂的*make_unique,这不是明智的做法。
你需要组合匹配器来从指针访问值。有一个匹配器testing::Pointee

ASSERT_THAT(charactersList, testing::Contains(testing::Pointee(Character("Nancy", "Wheeler"))));

同样的事情应该做ElementsAre(有更好的方法,但先进)。
以下是Live Demo:https://godbolt.org/z/ocTx5hf6W

相关问题