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



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

这里

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

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

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

是一个指针向量。没有Characteroperator==重载将帮助您找到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创建对象。

相关内容