根据备忘单https://github.com/google/googlemock/blob/master/googlemock/docs/v1_7/CheatSheet.md
可以使用ElementsAre(_,_,..)
来比较矢量的元素。
如果我们只希望选择向量的特定元素并将比较器放在第(n + 1)个条目的对象上,那么你将如何获取单个元素?
样品
struct MyStruct
{
MyPrimitiveClass1 class1_obj;
MyPrimitiveClass2 class2_obj;
};
std::vector< MyStruct > myvec;
我需要检查函数中传递的myvec
是否为
myvec[n] == test_my_struct_obj
编辑:
现在,为了使问题复杂化,myvec
本身就是一个类的字段,比如说MySuperClass
,并且传递的内容是MySuperClass my_superclass_obj;
。
我需要检查是否
my_sperclass_obj.myvec[n] == test_my_struct_obj
现在我有了这个结构
EXPECT_CALL(mocked_obj, foo(
Field(&MySuperClass::myvec,
ElementsAre(_, _ .. n-1 times,
MyStructMatcher(), _)
)
)
);
我的想法是逃避ElementsAre
并做一些更清洁的事情。有人有提示吗? (这里是n00b)
答案 0 :(得分:1)
使用函数封装您的问题,例如:
template <typename T>
std::vector<testing::Matcher<T>> matchNthElement(int index, int size, testing::Matcher<T> matcherForNthElement)
{
std::vector<testing::Matcher<T>> result{N, testing::_};
result[N] = matcherForNthElement;
return result;
}
使用ElementsAreArray
代替ElementsAre
:
auto matchContainerWithNthElement = matchNthElement(n, size, MyStructMatcher());
EXPECT_CALL(mocked_obj, foo(
Field(&MySuperClass::myvec,
ElementsAreArray(matchContainerWithNthElement.data(),
matchContainerWithNthElement.size())
)
)
);
答案 1 :(得分:0)
您可以在此处使用EXPECT_EQ
:
EXPECT_EQ(test_my_struct_obj, myvec[n]);
或者:
EXPECT_THAT(myvec[n], Eq(test_my_struct_obj));