2014-11-03 41 views
0

我有一个返回容器的函数。为了简单起见,我们假设这是一个std::list<int>googletest匹配器检查容器元素之间的关系

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

有没有办法使用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(而我使用p arameterised测试制表输入和输出),所以总体来说,我想写类似:

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

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