本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧:

  1. 如何模拟类的构造函数
  2. 优化代码,便于测试

一、如何模拟类的构造函数

1.1 被测代码

基础代码,IShape分别有Rectangle和Triangle俩个子类。有一个简单的CalculateArea方法。

namespace BlogDemo.UTDemo
{public interface IShape{int CalculateArea();}class Rectangle : IShape{public int CalculateArea(){return 1;}}class Triangle : IShape{public int CalculateArea(){return 100;}}
}

被测试的类:该类根据传入的参数不同而调用不同的子类进行操作。

class App{public void Calculate(string shapeType){if (shapeType == "T"){new Triangle().CalculateArea();}else{new Rectangle().CalculateArea();}}}

1.2 测试目标

现在要测试App类的Calculatef方法,测试该类的case可以分成两个

  1. 当输入(shapeType)为T的时候实例化Triangle类。
  2. 当输入为非T的时候实例化Rectangle类。

上面的测试主要是为了测试这个if的调度是否正确,而不关心Calculate到底做了什么。所以上面测试的验证不应该通过CalculateArea的值来进行验证,因为这违反了单元测试的“单元”二字。

1.3 测试代码

在ms.test框架下,可以通过ShimClassName.Constuctor来模拟类名为ClassName的类的构造函数

[TestClass]public class AppTests{[TestMethod]public void CalculateTest(){using (ShimsContext.Create()){var triangleConstructed = false;ShimTriangle.Constructor = (@this) =>//此处模拟Triangle类的构造函数,如果Triangle被实例化,则triangleConstructed为true
                {triangleConstructed = true;};var rectangleConstructed = false;ShimRectangle.Constructor = (@this) =>//此处模拟Rectangle类的构造函数,如果Rectangle被实例化,则rectangleConstructed为true
                {rectangleConstructed = true;};App.Calculate("T");Assert.IsFalse(rectangleConstructed);Assert.IsTrue(triangleConstructed);}}}

因为App.Calculate("T");所以Triangle类被实例化(triangleConstructed为true),而Rectangle类没有被实例化(rectangleCOnstructed为false)。

相反,得下面的测试结果:

  [TestClass]public class AppTests{[TestMethod]public void CalculateTest(){using (ShimsContext.Create()){var triangleConstructed = false;ShimTriangle.Constructor = (@this) =>//此处模拟Triangle类的构造函数,如果Triangle被实例化,则triangleConstructed为true
                {triangleConstructed = true;};var rectangleConstructed = false;ShimRectangle.Constructor = (@this) =>//此处模拟Rectangle类的构造函数,如果Rectangle被实例化,则rectangleConstructed为true
                {rectangleConstructed = true;};App.Calculate("F");//非T。Rectangle将会被实例化
                Assert.IsTrue(rectangleConstructed);Assert.IsFalse(triangleConstructed);}}}

二、代码优化。

在TTD中有一种说法叫做代码不可测试,其实要不是ms.test框架的Shim功能强大,上面的代码其实是不可测试的。上面的代码完全可以进行优化。

2.1 优化后的代码

  public class App{public static void Calculate(string shapeType){var shape = CreateShape(shapeType);shape.CalculateArea();}public static IShape CreateShape(string shapeType){if (shapeType == "T"){return new Triangle();}else{return new Rectangle();}}}

上面使用一个简单工场先构建一个IShape对象,这样这个构建过程以方法的形式公布出来,可以就这个CreateShape方法进行单独测试。

2.2 优化后的测试代码

        [TestMethod]public void CreateShape_TriangleConstructed_Test(){var shape = App.CreateShape("T");Assert.AreEqual(shape.GetType(), typeof(Triangle));}[TestMethod]public void CreateShape_RectangleConstructed_Test(){var shape = App.CreateShape("F");Assert.AreEqual(shape.GetType(), typeof(Rectangle));}

简单调整了一下代码,测试代码就变的非常简单,且非常清晰,当然针对优化后的代码之前使用Shim方式的测试代码还是可以继续运行的。

三、结论

使用微软的测试框架很多之前“不能测试”的代码依然可以继续测试,但是这不是好习惯,测试不应该过于依赖测试框架的feature。而是应该在测试的过程中慢慢调整代码,让代码变的可“测试”。

转载于:https://www.cnblogs.com/Brake/p/Shim_Constructor_And_Make_Code_Testable.html

使用Visual Studio进行单元测试-Part4相关推荐

  1. Visual Studio 2008单元测试实践一

    关键字:单元测试,Visual Studio 2008 单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试. 在一种传统的 ...

  2. Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...

    本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元测试,这是进行顺序测试.压力测试的基础.如果在Visual Studio 2 ...

  3. 使用Visual Studio进行单元测试

    原文:使用Visual Studio进行单元测试 一.使用Visual Studio进行单元测试的几个建议 1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> ...

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

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

  5. Visual Studio 2008 单元测试

    开发组件的时候使用VS集成的单元测试功能会很方便 1.新建一个类库项目,并为其中的类添加一个方法,方法任意 之后右键点击代码窗口 选择方法 为新建项目命名 然后在解决方案管理中就多了相应的Test P ...

  6. Visual Studio 2015 单元测试(c++初试)

    在新建完成一段c++代码之后,我们往往需要对代码进行测试,这时,就需要用到一个工具--单元测试(unit test). 第一步:我们需要在解决方案处右键->添加->新建项目. 第二步:选择 ...

  7. Visual Studio 单元测试之二---顺序单元测试

    此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试不熟悉的话,请先参看上一篇.http://blog.csdn.ne ...

  8. 【C++】Visual Studio教程(四) - Visual Studio其它功能

    00. 目录 文章目录 00. 目录 01. 模块化安装 02. 创建 Azure 云启用应用 03. 创建 web 应用 04. 生成跨平台应用和游戏 05. 连接到数据库 06. 调试.测试和改进 ...

  9. 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码...

    PS:微软专家写的一往篇VSTS2005测试功能说明,非常详细.适合初学者查看. 适用于: Microsoft Visual Studio 2005 Team System Beta 2 Team A ...

  10. 带你玩转Visual Studio——单元测试

    上一篇文章带你玩转Visual Studio--性能分析与优化讲了找出性能瓶颈和性能优化相关的技能,在大型企业项目的开发中,性能是固然重要的,而另一个过程--测试也是必不可少的.测试有很多的各类:功能 ...

最新文章

  1. 面对500篇GNN论文,心态差点儿崩了,幸好我有这本小书
  2. 用python生成词云wordcloud
  3. FILA之后又有Amer,安踏能成为“世界的安踏”吗?
  4. C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )
  5. Mysql中文乱码问题解决
  6. div设置宽度,实现不等比缩放,或设置最小宽度 min-width
  7. windows 卸载IE8还原IE7的方法
  8. 纪中B组模拟赛总结(2020.2.3)
  9. String类得常用方法
  10. oracle java javapath_系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案...
  11. 中国碳纤维复合加热元件行业市场供需与战略研究报告
  12. 【bzoj5452】[Hnoi2016]大数(莫队)
  13. 剑与远征服务器维修,剑与远征怎么换区 剑与远征在哪里切换新的服务器
  14. matlab矩阵除法——记忆技巧
  15. linux软连接与环境变量
  16. 用户帐户控制---为了对电脑进行保护,已经阻止此应用。---管理员已阻止你运行此应。有关详细信息,请与管理员联系。
  17. 基于android的酒店客房预订客户端app
  18. java高级软件架构师实战培训阶段一
  19. java 向路由器发送报文_9.IP选路 - loda0128的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 硬件设计之DDS AD9854

热门文章

  1. mysql ssh 导入时注意问题
  2. Apache HttpClient 客户端使用详解
  3. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_17-页面查询接口定义-定义模型-需求分析和模型类...
  4. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_7 ModelAttribute注解
  5. json文件_ajax
  6. 【bzoj 3131】[Sdoi2013]淘金
  7. css3 animate基本属性
  8. 转 json数组对象和对象数组
  9. 编写带界面的ActiveX控件(CAB网页控件)全过程
  10. 不同的数据库之间导数据