您的位置:首页 > 其它

得到完美的匹配器

2016-10-28 14:40 106 查看
作者: Zhangyong G.Mock Wan

原文链接:http://googletesting.blogspot.tw/2009/10/tott-making-perfect-matcher.html

在上一期中,我们曾介绍过GoogleC ++ Mocking 框架的匹配器能使测试代码和测试输出更加易读。但万一无法找到合适的匹配器,这时你该怎么办?

不要满足于任何不完美。不论是重组现有的匹配器或者是从头再写一个,实现一个你所需要的匹配器是很容易的

最简单的复合匹配是非(M),你可能已经猜到了就是否定匹配M。此外还有OR-ingAnyOf(m1, ..., mn)AND-ingAllOf(m1, ..., mn)。适当的结合可以得到更多匹配器。例如:

EXPECT_THAT(new_code, AnyOf(StartsWith(“//Tests”)),

              Not(ContainsRegex(“TODO.*intern”))));

可以生成一个消息:

Expected: (starts with “// Tests”) or

          (doesn't containregular expression “TODO.*intern”)

Actual: “/* TODO: hire an intern. */ int main() {}”

如果匹配表达式太复杂,或现有的匹配器无法实现你所想要的匹配逻辑,你可以使用普通的C + +。宏匹配器允许定义一个命名匹配

MATCHER(IsEven, “”) { return (arg % 2)== 0; }

使你能够写EXPECT_THAT(paren_num, IsEven())方法来验证paren_num能够被2整除。这个特殊变量arg与需要验证的值相同(在该例中为paren_num变量)–它不是全局变量。

只要它返回布尔值,你可以在{}中放置任何代码来验证变量arg。

空字符串“”在谷歌C++ mocking框架中能够通过匹配器的名字自动生成相应描述(因此当它匹配失败时会显示”Expected: is even”)。 只要你起了一个具有描述性的名字,这个匹配器就相当于有了一个不错的说明。

你也可以给多个参数匹配,或自定义描述。代码如下:

// P2 的意思是匹配器有两个参数,名字分别为low和high.

MATCHER_P2(InClosedRange, low, high, “is in range[%(low)s, %(high)s]”) {

  return low <= arg && arg <= high;

}

...

EXPECT_THAT(my_age, InClosedRange(adult_min, penalty_to_withdraw_401k));

 

输出结果:

Expected: is in range [18, 60]

  Actual: 2

(不,那不是我的真实年龄。)也就是说可以在描述的字符串中使用Python的字符串替换来打印匹配参数。也许你会疑惑,为什么没有看到任何类型的例子。请放心,我们介绍的所有代码都是安全类型的。GoogleC++ Mocking
框架使用编译器类型推断来“写”匹配参数
,这样你就可以将时间用在实际写测试或寻址更好的匹配器上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: