如何为输入参数匹配union中元素的值,例如 - 如果我使用以下符号模拟方法 -
struct SomeStruct
{
int data1;
int data2;
};
void SomeMethod(SomeStruct data);
如何在参数中使用正确的值调用此方法的模拟?
答案 0 :(得分:15)
详细阅读了Google模拟文档后,我解决了Defining Matchers部分中记录的问题。 (一个例子会很棒!)
因此,解决方案是使用MATCHER_P
宏来定义自定义匹配器。所以对于匹配SomeStruct.data1
,我定义了一个匹配器:
MATCHER_P(data1AreEqual, ,"") { return (arg.data1 == SomeStructToCompare.data1); }
在期望中匹配它我像这样使用这个自定义宏:
EXPECT_CALL(someMock, SomeMethod(data1AreEqual(expectedSomeStruct)));
此处,expectedSomeStruct
是我们期待的structure.data1
的值。
请注意,正如其他答案(在本文和其他文章中)中所建议的那样,它要求被测单元进行更改以使其可测试。这不应该是必要的!例如。重载。
答案 1 :(得分:6)
Google提供了一些关于使用gmock的完整文档,其中包含示例代码。我强烈建议您查看它:
https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#using-matchers
正如您所指出的,不会为类类型(包括POD)自动创建默认的相等运算符(==
)。由于gmock在匹配参数时使用此运算符,因此您需要显式定义它以便像使用任何其他类型一样使用该类型(如下所示):
// Assumes `SomeMethod` is mocked in `MockedObject`
MockedObject foo;
SomeStruct expectedValue { 1, 2 };
EXPECT_CALL(foo, SomeMethod(expectedValue));
因此,最直接的处理方法是为结构定义一个等于运算符:
struct SomeStruct
{
int data1;
int data2;
bool operator==(const SomeStruct& rhs) const
{
return data1 == rhs.data1
&& data2 == rhs.data2;
}
};
如果您不想走这条路线,可以考虑使用the Field matcher根据其成员变量的值匹配参数。 (如果测试有兴趣比较结构实例之间的相等性,那么它很好地表明其他代码也会感兴趣。因此,定义{{1}可能是值得的。并完成它。)
答案 2 :(得分:2)
也许这个问题很久以前就没有用了,但这是一种适用于任何结构且不使用MATCHER或FIELD的解决方案。
假设我们正在检查:methodName(const Foo&foo):
using ::testing::_;
struct Foo {
...
...
};
EXPECT_CALL(mockObject, methodName(_))
.WillOnce([&expectedFoo](const Foo& foo) {
// Here, gtest macros can be used to test struct Foo's members
// one by one for example (ASSERT_TRUE, ASSERT_EQ, ...)
ASSERT_EQ(foo.arg1, expectedFoo.arg1);
});
答案 3 :(得分:0)
上面已基本回答了这个问题,但我想再举一个例子:
let data = [{
"title": "CAP Pâtissier à La Ciotat - GRETA Marseille Méditerranée - Académie ...",
"url": "https://www.gretanet.com/formation-cap-patissier+la-ciotat+1007.html",
"displayedUrl": "https://www.gretanet.com/formation-cap-patissier+la-ciotat+1007.html",
"description": "Formation CAP Pâtissier à La Ciotat - GRETA Marseille Méditerranée - Académie d'Aix-Marseille.",
"siteLinks": []
},
{
"title": "Les sujets du CAP pâtissier - EISF",
"url": "https://www.eisf.fr/sujets-examen-cap-patisserie/",
"displayedUrl": "https://www.eisf.fr/sujets-examen-cap-patisserie/",
"description": "8 déc. 2018 - Vous voulez vous entrainer à l'examen du CAP Pâtissier ? Retrouver les annales des années précédentes. Sujets CAP Pâtissier 2018.",
"siteLinks": []
}
];
let indexArr = [];
data.forEach(function(item, index) {
if (item.url.indexOf('eisf') !== -1) {
indexArr.push(index);
}
});
console.log(indexArr)