如何使用谷歌测试的容器匹配器来检查容器中是否存在值对象?

问题描述 投票:0回答:2

我在 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

c++ googletest googlemock
2个回答
0
投票

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

这个

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

是指针向量。没有为

operator==
重载
Character
将帮助您找到
Character
指针。

由于不可能为指针重载

operator==
,我建议您更改代码以使用
Characters
(即
std::vector<Character> charactersList = ...
)的向量,或者如果那不可能,请使用不同的技术来查找是否有一个矢量中的指针指向特定字符。 编辑: 正如 Marek R 所指出的,不同的技术已经用
testing::Pointee
)

正如评论中已经指出的

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

是完全错误的说法

Character("Nancy", "Wheeler")

你不能像 C# 上的一些小变体一样编写 C++。这两种语言非常不同。在 C# 中,您通常使用

new
创建对象。在 C++ 中,您很少使用
new
.

创建对象

0
投票

这里

        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
做同样的事情(有更好的方法,但要先进)。

这里是现场演示:https://godbolt.org/z/ocTx5hf6W

© www.soinside.com 2019 - 2024. All rights reserved.