What is “Mock You”系列之(二) 参数匹配-It & Match<T>
2010-02-21 17:14
453 查看
上一篇介绍了Moq并给出了一个入门的例子。下面说说Moq中的参数匹配。先看Mock<T>的一个方法。
public ISetup<T> Setup(Expression<Action<T>> expression);
熟悉.NET框架尤其是开发过基于MVVM的WPF应用程序的朋友对Action<T>和Prediect<T>这两个泛型委托应该不陌生,这两个委托的含义很简明,前者表示给定一个参数然后施展一个行为,后者表示施行行为的前提。
假如我们有一个接口IA,IA有一个方法签名string MethodA1(stringidentity)。那么我们怎么模拟一个实现IA接口的对象MethodA1呢?
这个例子和上一篇是一样的,这里在额外说明下:Return的参数类型取决于方法的返回类型,如果我们把MethodA1返回void,那么就没法Return方法了,这里由于返回string类型,所以能Return。
当然,方法参数可可选值很多,"51",”52”,”53”,”54”,”55”,”56”……如果我们一个一个的Setup怎么能行?我向大家隆重推出两个类:It,Match<T>。
先说It,It很适合用来匹配数字,字符串参数,它提供了如下几个静态方法(取自Moq的官方API文档):
第一个方法的参数Expression<Predict<TValue>>类型,当你需要某种类型并且这种类型要通过代码来判断的话可以使用它。
第二个方法没有参数,只要是TValue类型的就能匹配成功。
第三个方法用来匹配两个的TValue类型值之间的参数。(Range参数可以设定开闭区间)
第四个是用正则表达式匹配。(仅限于字符串类型参数)
举个例子:
但是It提供的功能还是显得有些弱,这时候我们可以自定义匹配验证规则。这就用到了Match<T>。
Match<T>是个静态类,它值公开了一个静态方法(重载了两个版本):public static T Create(Predict<T> condition, ……)。
先看下下面的代码便于讲解,我们写个用于参数匹配的静态帮助类。
对我们而言CustomMatcher(string arg)和Contains(string key)就是验证方法。和上个例子比较,就是将p => p.MethodWithParamAndResult(……)里面的东西换成了我们自己的方法。另外一个Contains方法是可用来满足这样一个需求:给定的参数为可迭代类型,只有包含特定的元素时才能匹配。
public ISetup<T> Setup(Expression<Action<T>> expression);
熟悉.NET框架尤其是开发过基于MVVM的WPF应用程序的朋友对Action<T>和Prediect<T>这两个泛型委托应该不陌生,这两个委托的含义很简明,前者表示给定一个参数然后施展一个行为,后者表示施行行为的前提。
假如我们有一个接口IA,IA有一个方法签名string MethodA1(stringidentity)。那么我们怎么模拟一个实现IA接口的对象MethodA1呢?
var mo = new Mock<IA>(); mo.Setup( p => p.MethodA1(“50”)).Return(“Hello, mocker”); |
当然,方法参数可可选值很多,"51",”52”,”53”,”54”,”55”,”56”……如果我们一个一个的Setup怎么能行?我向大家隆重推出两个类:It,Match<T>。
先说It,It很适合用来匹配数字,字符串参数,它提供了如下几个静态方法(取自Moq的官方API文档):
第一个方法的参数Expression<Predict<TValue>>类型,当你需要某种类型并且这种类型要通过代码来判断的话可以使用它。
第二个方法没有参数,只要是TValue类型的就能匹配成功。
第三个方法用来匹配两个的TValue类型值之间的参数。(Range参数可以设定开闭区间)
第四个是用正则表达式匹配。(仅限于字符串类型参数)
举个例子:
[TestMethod] [Owner(wJiang)] public void MoqTest1() { var mo = new Mock<TargetInterfaceOne>(); mo.Setup(p => p.MethodWithParamAndResult(It.IsRegex("^God.*$"))).Returns("bless me"); mo.Setup(p => p.MethodWithParamAndResult(It.Is<string>((param => param.IndexOf("Evil") >= 0)))).Returns("away from me"); //mo.Setup(p => p.MethodWithParamAndResult(It.): Assert.AreEqual("bless me", mo.Object.MethodWithParamAndResult("God comes")); Assert.AreEqual("away from me", mo.Object.MethodWithParamAndResult("Evil is here")); } |
这样参数就能自动匹配了,如果参数为”God comes”,MockObject会返回”bless me”结果,如果参数中含有Evil则返回”away from me”结果。 |
Match<T>是个静态类,它值公开了一个静态方法(重载了两个版本):public static T Create(Predict<T> condition, ……)。
先看下下面的代码便于讲解,我们写个用于参数匹配的静态帮助类。
[TestMethod()] public void MoqTestA() { var mo = new Mock<TargetInterfaceOne>(); mo.Setup(p => p.MethodWithParamAndResult(MatchHelper.CustomMatcher("abc"))).Returns("123"); Assert.AreEqual(mo.Object.MethodWithParamAndResult("abc"), “123); Assert.IsNull(mo.Object.MethodWithParamAndResult(“newyorktimesbyflex”)); } public static class MatchHelper { public static string CustomMatcher(string arg) { return Match<string>.Create( p => p.Equals(arg), ()=>null); } public static IEnumerable<string> Contains(string key) { return Match<IEnumerable<string>>.Create(p=>p.Contains(key)); } } |
相关文章推荐
- 实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)
- <仅是自己做笔记。。。系列15>实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3这些都要找出来
- <IT基础复习系列1之玩转Spring>Spring基础之高效学习(一)
- <leetcode系列> Valid Anagram
- asp.net<Web版> ---GridView 数据导出到excel表,系列问题<一>---导出的Excel文件格式与文件扩展名指定的格式不一致
- <仅是自己做笔记。。。系列x>所有系列题目都来自v_JULY_v前辈的:精选微软等公司经典的算法面试100题
- <leetcode系列> Path Sum
- 正则表达式匹配URL——给URL地址加上<a> 链接
- 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式
- IT成长路<2014.3-2014.9>"不惑"上篇
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
- <读书笔记>Javascript系列之6种继承(面向对象)
- <仅是自己做笔记。。。系列-10>n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
- IT项目管理之----<<少林练步拳>>(转)
- 单击 < a > 的时候获取href并且让href增加一个参数
- js正则:匹配一个html的tagname的开始标签,主要是解决包含&lt;&gt;(正则的效率问题建议不使用)
- <转>Android2.2 API 中文文档系列(9) —— ZoomButton
- 使用vim编写c++对于输入输出流<<和<>括号匹配冲突的解决方法
- MongoDB系列应用<二>
- Hadoop系列之Terasort<转>