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

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

案例说明

用以下实例来进行单元测试

//检查文件名的长度,并使用IWebService来记录错误
public class CheckLength
{public IWebService webService { get; set; }public IEmailService emailService { get; set; }public void Analyze(string fileName){if (fileName.Length<8){webService.LogError("文件名称太短");}else{emailService.SendEmail("123@qq.com", "文件名符合要求");}}
}

我们发现webService和emailService都是外部依赖对象,需要我们自己写Stub和Mock来模拟这两个外部对象

public class StubWebService : IWebService
{public void LogError(string message){Debug.WriteLine(message);}
}public class MockEmailService : IEmailService
{public string Email { get; set; }public string message { get; set; }public void SendEmail(string email, string message){this.Email= email;this.message = message;}
}

然后进行单元测试

[Fact()]
public void AnalyzeTest()
{//arangeStubWebService stubService = new StubWebService();MockEmailService mockService = new MockEmailService();CheckLength checkLength = new CheckLength();//将自定义的服务赋给checkLengthcheckLength.emailService = mockService;checkLength.webService= stubService;//actstring fileName = "a3t";checkLength.Analyze(fileName);//assertAssert.Equal("123@qq.com", mockService.Email);Assert.Equal("文件名符合要求", mockService.message);
}

stub和Mock的区别

从上面可以看出,Stub是完全模拟一个外部依赖(直接输出,无法进行断言),而Mock则是用来断言

注意事项:

要以接口为依赖对象,例如本案例中

public IWebService webService { get; set; }
public IEmailService emailService { get; set; }

Moq是.net平台下的一个非常流行的模拟库,目前依赖注入模式非常流行,有时被测试的类或者方法需要注入数十项接口,如果像上面那样将接口重写为自定义的“假实现”,也要写大量的代码,而利用moq框架可以自动生成接口的代理对象,减少工作量。

moq框架教程

C#/.net 单元测试xUnit、Mock、Moq相关推荐

  1. React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers)

    转载 React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers) 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 ...

  2. Java单元测试(Junit+Mock+代码覆盖率)

    单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进 ...

  3. 单元测试-xUnit

    单元测试-xUnit Assert常用方法 名称 描述 Eqalexpected.result) 断言结果与期望值相等.该方法的重载版本用于比较不同的类型和集合.该方法的另一种版本接受一个额外参数 该 ...

  4. 单元测试与 Mock 方法

    Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 编写自定义的 Mock 对象需要额外的编码工作,同时也可能 ...

  5. .Net单元测试知识点及moq框架介绍

    .Net单元测试框架: moq 如果项目目的Internal方法需要再单元测试项目中引用到测试,由于默认情况下,Internal只能在同一程序集中引用,这种情况下需要在AssemblyInfo.cs中 ...

  6. 使用 @MockBean 和 @SpyBean 解决 SpringBoot 单元测试中 Mock 类装配的问题

    最近在做某个项目的时候一直使用 @MockBean 来解决单元测试中 Mock 类装配到被测试类的问题.这篇文章主要介绍了 @MockBean 的使用例子以及不使用 @MockBean 而使用@Spy ...

  7. 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

    最近在做一个项目的单元测试时,遇到了些问题,解决后,觉得有必要记下来,并分享给需要的人,先简单说一下项目技术框架背景: asp.net core 2.0(for .net core)框架 用Entit ...

  8. 单元测试 | 如何Mock IHttpClientFactory

    前言 编写单元测试时,常常需要使用Mock框架(例如Moq)生成测试类的依赖接口的"模拟"实现,并验证接口是否按预期使用: _mediatorMock = new Mock< ...

  9. 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...

最新文章

  1. 清华、北大、中科院六位专家同台论道:生物智能的本质与下一代类脑AI
  2. 【商务智能】数据预处理
  3. javascript之模拟call以及apply实现
  4. 迁移学习简介(tranfer learning)
  5. 重载VerifyRenderingInServerForm
  6. python之itemgetter函数:对字典列表进行多键排序
  7. 多进程Socket_Client
  8. centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展
  9. 关于软件工程的那些事儿————《人·绩效·职业道德》和《一个程序员的生命周期》读后感...
  10. [置顶] 我行贿了 I Paid A Bribe! --印度IPAB中国官方网站 - 民间反腐网站“我行贿了”网址大盘点...
  11. Cucumber常用关键字
  12. 软件网站安全性的设计与检测与解决方案
  13. 直播开发中关于三级分销功能源码的实现介绍
  14. 书里都没的高清无码彩图【人人都是产品经理:9084】
  15. python 全国内地中高风险地区数量查询与可视化(分省)
  16. Spring cloud实现FeignClient指定Zone调用
  17. 区块链可以减少社会不平等吗?
  18. 定义bool型变量出现 ”identifier “bool” is undefined”错误
  19. 少儿美术课儿童画之水彩画第3集《高高的长颈鹿》
  20. 递归查询,父类获取对应子类集合

热门文章

  1. Nydus 镜像扫描加速
  2. 微软IE8新功能对谷歌广告模式造成威胁
  3. 阿里云 rm-rf 怎么办
  4. 【洛谷】1174:打砖块
  5. Thrift安装介绍
  6. 上海信托面试20190820
  7. 2021-06-04《小王子》读后感
  8. Android ComponentName简介
  9. 从996.icu来谈一谈如何高效支配时间
  10. 万字长文教你使用安卓内核驱动进行内存读写