用于检查容器元素之间关系的googletest匹配器

时间:2014-11-03 20:56:27

标签: c++ unit-testing googletest googlemock

我有一个返回容器的函数。为简单起见,我们说它是std::list<int>

如果容器有三个元素,并且第一个和第三个元素彼此相同且与第二个元素不同,则应该通过特定测试。没有指定元素的实际值,只是它们之间的关系。

有没有办法使用gmock Matchers实现这样的测试?也许它看起来像是:

EXPECT_THAT( list , ElementsMapOnto( A , B , A ) );

我想到了类似的东西:

EXPECT_THAT( list , ElementsAre( _ , Ne(at(list,0)) , Eq(at(list,0) );

但这给我带来了两个问题:

1)如果有几个独特的值,它就不能很好地扩展(我必须写AllOf(Ne(at(list(0)),Ne(at(list,1)),...);

2)它需要在创建匹配器之前创建list(而我使用参数化测试来表示输入和输出),所以总体而言我想写一些类似的东西:

TestSpec tests[] = { { someInputData , ElementsMapOnto( A , B , A ) }, ... };

struct MyTest : testing::Test , testing::TestWithParam<TestSpec> { ... };

TEST_P( MyTest , )
{
    std::list<int> list = functionUnderTest( GetParam().someInputData );
    EXPECT_THAT( list , GetParam().matcher );
}

1 个答案:

答案 0 :(得分:1)

在这种情况下,定义自己的匹配器通常要容易得多,而不是试图扭曲内置的googlemock匹配器来适应这种特定的用例。例如,在这里你可以提出某种数据结构来定义容器中元素之间的有效关系,然后构建自己的匹配器,将该规范作为输入。