gmock:只检查向量

时间:2017-05-11 09:54:59

标签: c++ googletest googlemock gmock

根据备忘单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)

2 个答案:

答案 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));