在TDD开发模型中,经常是在编码的同时进行单元测试的编写,由于现代软件开发不可能是一个人完成的工作,所以在定义好接口的时候我们就可以进行自己功能的开发(接口不能经常变更),而我们调用他人的功能时只需要使用接口即可。
但我们在编写自己的单元测试并进行功能验证的时候,如果接口的实现人还没有完成代码怎么办呢?一般我们可能会自己写一个模拟实现来进行单元测试,这就是我们经常所说的单元测试中的Stub和Mock(关于单元测试的Stub和Mock,可以自己度娘一下,也可以参考https://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html, 本文的部分代码来自于这篇博客)。在.net环境中可以使用的Mock框架是Moq,目前版本4.10。
我们使用NuGet安装依赖的库xUnit,Moq等。
我们定义两个接口:

    public interface IWebService{void LogError(string msg);}public interface IEmailService{void SendEmail(string a, string b, string c, string d);}

一个类:

    public class LogAnalyzer{private IWebService service;private IEmailService email;public IWebService Service{get { return service; }set { service = value; }}public IEmailService Email{get { return email; }set { email = value; }}public void Analyze(string fileName){if (fileName.Length < 8){try{service.LogError("the file name is to short" + fileName);}catch (Exception e){email.SendEmail("From@test.com", "To@test.com", "IWebServiceFailed", e.Message);}}}}

我们要进行这个类的测试,其中两个接口的实现是别人来做。我在自己的单元测试中不想去引用他人的实现,也不想自己写Mock,所以使用框架Moq来创建我想要的对象。

public class LogAnalyzerTest{[Fact(DisplayName = "使用MOQ框架")]public void AnalyzeTest(){var mockWebService = new Mock<IWebService>();mockWebService.Setup(p => p.LogError(It.Is<string>(str => str.Length > 8))).Throws(new Exception());var mockEmailService = new Mock<IEmailService>();var a = mockEmailService.Setup(e => e.SendEmail("From@test.com", "To@test.com", "IWebServiceFailed", It.Is<string>(x=>x != null)));LogAnalyzer log = new LogAnalyzer();log.Service = mockWebService.Object;log.Email = mockEmailService.Object;log.Analyze("xxx");mockEmailService.Verify(p => p.SendEmail("From@test.com", "To@test.com", "IWebServiceFailed", It.Is<string>(x => x != null)));}}

这样我就完成了我的单元测试,而不用去关心我的依赖的代码的实现。保证我的功能的正确性。
对上面Mock的说明如下:
第一个模拟LogError抛出异常的代码:

            mockWebService.Setup(p => p.LogError(It.Is<string>(str => str.Length > 8))).Throws(new Exception());

第一行,当参数类型是string且长度大于8时正常执行,而长度长于等于8时则抛出异常。他的另一种写法是范型:

            mockWebService.Setup(p => p.LogError(It.Is<string>(str => str.Length > 8))).Throws<Exception>();

在我调用分析方法Analyze时传入的字符串不长于8个,就会完成异常抛出异常的功能。
第二个是Email接口的Mock对象,创建如下:

            var a = mockEmailService.Setup(e => e.SendEmail("From@test.com", "To@test.com", "IWebServiceFailed", It.Is<string>(x=>x != null)));

因为最后一个参数是异常的Message,所以我们需要动态指定。前三个参数和代码中一致。
最后验证SendEmail有没有执行。这行代码不能放在log.Analyze调用之前。因为这个时候方法还没有调用,单元测试不会通过。并且参数保持一致。如果参数不一致(特别是前三个)也会测试失败。这就是Mock的强大之处。

你的支持是我继续的动力啊。

【C#】【xUnit】【Moq】.NET单元测试Mock框架Moq初探!相关推荐

  1. Mock 框架 Moq 的使用

    Mock 框架 Moq 的使用 Intro Moq 是 .NET 中一个很流行的 Mock 框架,使用 Mock 框架我们可以只针对我们关注的代码进行测试,对于依赖项使用 Mock 对象配置预期的依赖 ...

  2. 单元测试mock框架——jmockit实战

    JMockit是google code上面的一个java单元测试mock项目,她很方便地让你对单元测试中的final类,静态方法,构造方法进行mock,功能强大.项目地址在:http://jmocki ...

  3. 单元测试Mock框架--Mockito

    文章目录 目前开发中,单元测试遇到的问题 解决方案--Mock Junit4 + Mockito: Mockito常用注解: Mockito常用方法: Tips: 总结 目前开发中,单元测试遇到的问题 ...

  4. C#/.net 单元测试xUnit、Mock、Moq

    C#/.net 单元测试xUnit.Mock.Moq 在做单元测试的时候,有时需要引用很多的外部对象,例如网络通信.记录日志等.单元测试无法控制这些外部的依赖对象,所以需要使用Stub和Mock来模拟 ...

  5. 转使用Moq让单元测试变得更简单

    [ASP.Net MVC3 ]使用Moq让单元测试变得更简单 前几天调查完了unity.现在给我的任务是让我调查Moq. 以下是自己找了资料,总结并实践的内容.如果有表述和理解错误的地方.恳请指正. ...

  6. 使用Moq实现单元测试

    先开个头,当我们对A进行单元测试时,可能会发现A的实现必须要依赖B.这时,我们在写单元测试时,就必须先创建B的实例,然后把B传给A再建立A的实例进行测试. 这样就会出现一些问题: 1.我们的单元测试会 ...

  7. Mock和Java单元测试中的Mock框架Mockito介绍

    什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...

  8. Mock框架的三次迭代,让你的单元测试更高效

    如何定义单元 对于单元测试中的单元,不同的人有不同的看法:可以理解为一个方法,可以理解为一个完整的接口实现,也可以理解为一个完整的功能模块或者是多个功能模块的一个耦合. 根据以往的单元测试经验,在设计 ...

  9. 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用

    转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具 单元 ...

最新文章

  1. Boost--Graph
  2. hdu4635(最多加多少边,使得有向图不是强连通图)
  3. 用Java实现几种常用排序算法(先实现一个org.rut.util.algorithm.SortUtil)
  4. Hadoop学习记录(4)|MapReduce原理|API操作使用
  5. 数据结构与算法 | 归并排序
  6. 【渝粤教育】国家开放大学2018年春季 0054-21T合同法 参考试题
  7. win10安装python的xlrd_win10安装python的xlrd
  8. 【转】查看linux服务器的系统信息
  9. 人月神话贯彻执行_《人月神话》读后感与读书笔记
  10. AtCoder Beginner Contest 238
  11. pdf合并成一个pdf软件下载?pdf合并成一个pdf软件合成器工具
  12. Flash | 用几张帧图创建逐帧动画元件并插入场景层的一般步骤
  13. 分享一个python连接zookeeper的坑:句柄无效
  14. win10的服务器管理器在哪打开?
  15. HTML一个简单大一的网页作业
  16. Jdon Framework
  17. Spring Boot配置ssl证书
  18. 神舟电脑董事长吴海军作客CNET中国,笑谈国货08怎夺江山
  19. python中stripped string_22-.strings 和 stripped_strings变量多个文本
  20. Git——git的简单使用以及连接gitee的远程仓库[经验 y.2]

热门文章

  1. C#开发之——Mutex(14.8)
  2. 悬赏任务源码_thinkPHP任务悬赏平台源码
  3. C#中给RichTextBox加上背景图片
  4. 每次打开office都需要自动配置怎么办?
  5. goip设备的特点_【社会】惊呆!吉安一深山老林里来了4个人,架设大量设备,居然干这个…...
  6. serializeArray()和serialize()方法
  7. 世界机器人大赛_体验未来黑科技!BCI脑控机器人亮相2019世界机器人大赛总决赛...
  8. 1127: 电话号码
  9. 不用花一分线,松哥手把手教你上线个人博客
  10. 09年国庆10月1日开放注册的论坛大全