博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TDD:什么是桩(stub)和模拟(mock)?
阅读量:6324 次
发布时间:2019-06-22

本文共 2626 字,大约阅读时间需要 8 分钟。

背景

本文假设你对TDD、Stub和Mock已经有了初步的认识,本文简单解释一下stub和mock的区别和使用场景,先看看他们之间的关系:

由上图可以知道mock框架可以非常容易的开发stub和mock,但是stub框架想要提高mock机制就要靠自己扩展了。

Stub

stub存在的意图是为了让测试对象可以正常的执行,其实现一般会硬编码一些输入和输出,下面的代码使用了MS自带的Fake和Shim来实现stub。

Fake实现

1 using System; 2 using Microsoft.VisualStudio.TestTools.UnitTesting; 3  4 using TDDStudy.Library.WhatIsStub; 5 using TDDStudy.Library.WhatIsStub.Fakes; 6  7 namespace TDDStudy.WhatIsStub 8 { 9     [TestClass]10     public class WhatIsStubTest11     {12         [TestMethod]13         public void Stub_Test()14         {15             var domainService = new DomainService(CreateStubDependencyService());16             domainService.Task();17         }18 19         private IDependencyService CreateStubDependencyService()20         {21             return new StubIDependencyService22                     {23                         OtherTask = () => { }24                     };25         }26     }27 }

Shim实现

1 using System; 2 using Microsoft.VisualStudio.TestTools.UnitTesting; 3 using Microsoft.QualityTools.Testing.Fakes; 4  5 using TDDStudy.Library.WhatIsShim; 6 using TDDStudy.Library.WhatIsShim.Fakes; 7  8 namespace TDDStudy.WhatIsShim 9 {10     [TestClass]11     public class WhatIsStubTest12     {13         [TestMethod]14         public void Shim_Test()15         {16             using (ShimsContext.Create())17             {18                 var domainService = new DomainService(CreateShimDependencyService());19                 domainService.Task();20             }21         }22 23         private DependencyService CreateShimDependencyService()24         {25             return new ShimDependencyService26                     {27                         OtherTask = () => { }28                     };29         }30     }31 }

备注:微软的Fake适合接口、保护虚方法的类,Shim适合其它类(封闭的、非虚的)。

Mock

mock除了保证stub的功能之外,还可深入的模拟对象之间的交互方式,如:调用了几次、在某种情况下是否会抛出异常,下面的代码使用了moq来实现mock。

moq实现

1 using System; 2 using Microsoft.VisualStudio.TestTools.UnitTesting; 3  4 using Moq; 5 using TDDStudy.Library.WhatIsMock; 6  7 namespace TDDStudy.WhatIsMock 8 { 9     [TestClass]10     public class WhatIsStubTest11     {12         [TestMethod]13         public void Mock_Test()14         {15             var mock = CreateMockDependencyService();16 17             var domainService = new DomainService(mock.Object);18             domainService.Task();19 20             mock.Verify(x => x.OtherTask(), Times.AtMostOnce);21         }22 23         private Mock
CreateMockDependencyService()24 {25 return new Mock
();26 }27 }28 }

备注:mock是一种功能丰富的stub。

备注

我目前只使用MS的Fake,感觉够了。

 

转载地址:http://oqdaa.baihongyu.com/

你可能感兴趣的文章
基于ZooKeeper的Dubbo注册中心
查看>>
知乎上关于c和c++的一场讨论_看看高手们的想法
查看>>
漫说模板方法模式---学生时代的烦恼
查看>>
Zero Copy
查看>>
正则表达式-贪婪与懒惰
查看>>
.NET中使用Redis
查看>>
PHP 函数dirname()使用实例
查看>>
jQuery attr方法修改onclick值
查看>>
魔术布局效果-使用本地JSON数据提供数据服务
查看>>
WCF分布式开发必备知识(2):.Net Remoting
查看>>
PHP与MYSQL中UTF8 中文排序例子
查看>>
【多线程】学习11
查看>>
如何在Datatable中取得每列的数据列宽度
查看>>
XML学习笔记
查看>>
任务调度开源框架Quartz动态加入、改动和删除定时任务
查看>>
C#、.NET网络请求总结(WebClient和WebRequest)
查看>>
[再寄小读者之数学篇](2014-11-20 计算二重积分)
查看>>
Material Designer的低版本兼容实现(八)—— Flat Button
查看>>
haha
查看>>
ContentProvider简单介绍
查看>>