得到完美的匹配器

来源:互联网 发布:ipadair2下载软件 编辑:程序博客网 时间:2024/05/02 01:47

作者: 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 的意思是匹配器有两个参数,名字分别为lowhigh.

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框架使用编译器类型推断来“写”匹配参数,这样你就可以将时间用在实际写测试或寻址更好的匹配器上。

0 0
原创粉丝点击