我有一个返回容器的函数。为简单起见,我们说它是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 );
}
答案 0 :(得分:1)
在这种情况下,定义自己的匹配器通常要容易得多,而不是试图扭曲内置的googlemock匹配器来适应这种特定的用例。例如,在这里你可以提出某种数据结构来定义容器中元素之间的有效关系,然后构建自己的匹配器,将该规范作为输入。