【题外话】

  对单元测试不熟悉的童鞋可参照我之前写过的两篇博文:

在Visual Studio 2012使用单元测试》、

VS2012 单元测试之泛型类(Generics Unit Test)》。
  

  以下Demo将使用我已写好的一些关于单元测试的类库(已放至 https://idletest.codeplex.com/

,其用了大量的匿名方法,同样不熟悉的可参照我上一篇博文《委托的N种写法,你喜欢哪种?》)。

【进入正题】

   与其说对接口测试还不如说针对抽象测试,也是我个人比较喜欢的编码步骤:编写接口(面向抽象)=>单元测试=>实现。

  OK here we go...

  首先假设有如下接口(这也是从我的代码中提取出来的)

    public interface ITextFormatter
{
/// <summary>
/// 根据指定格式字符串获取对象
/// </summary>
T GetObject<T>(string formatString); /// <summary>
/// 将对象转化为指定格式字符串
/// </summary>
string GetString(object obj);
}

  那么接下来我要做的并不是马上去实现它,而是测试先行,我将编写如下测试代码

    public abstract class BaseFormatterTest
{
protected abstract ITextFormatter formatter
{
get;
} /// <summary>
///GetObject 的测试
///</summary>
public void GetObjectTestHelper<T>()
{
AssertCommon.AssertIsNull<string, T>(TestCommon.GetEmptyStrings(), true, (string strTemp) => {
return formatter.GetObject<T>(strTemp);
}); EntityParameter ep = new EntityParameter();
string str = formatter.GetString(ep);
EntityParameter actual = formatter.GetObject<EntityParameter>(str);
Assert.IsNotNull(actual);
Assert.AreEqual<int>(, actual.Data);
} public virtual void GetObjectTest()
{
GetObjectTestHelper<GenericParameterHelper>();
} /// <summary>
///GetString 的测试
///</summary>
public virtual void GetStringTest()
{
AssertCommon.AssertEmpty<string>(formatter.GetString(null)); AssertCommon.AssertEmpty<string>(formatter.GetString(new object()), false); string actual = formatter.GetString(new EntityParameter());
AssertCommon.AssertEmpty<string>(actual, false);
EntityParameter entity = formatter.GetObject<EntityParameter>(actual);
Assert.AreEqual<int>(, entity.Data);
}

针对接口测试抽象基类

值得注意的是以上方法中包含了一个叫做AssertCommon类,这个是我自己定义的,源码在 https://idletest.codeplex.com/。

  我现在通过Xml序列化实现字符串与对象的相互转化,所以我继承这个基类来编写具体的测试,当然此时的测试代码就很简单了。

    /// <summary>
///这是 ITextFormatterTest 的测试类,旨在
///包含所有 ITextFormatterTest 单元测试
///</summary>
[TestClass()]
public class XmlFormatterTest : BaseFormatterTest
{
[TestMethod()]
public override void GetObjectTest()
{
base.GetObjectTest();
} /// <summary>
///GetString 的测试
///</summary>
[TestMethod]
public override void GetStringTest()
{
base.GetStringTest();
} protected override ITextFormatter formatter
{
get { return new XmlFormatter(); }
}
}

  完成测试编码后开始实现具体代码,我这里将创建一个抽象基类和一个子类去实现需要的功能

    public abstract class BaseFormatter
{
private Encoding encoding;
public Encoding Encoding
{
get { return this.encoding; }
} public BaseFormatter(Encoding encoding)
{
this.encoding = encoding;
}
}
    public class XmlFormatter : BaseFormatter, ITextFormatter
{
public XmlFormatter() : base(Encoding.Default) { } public XmlFormatter(Encoding encoding) : base(encoding) { } /// <summary>
/// 将对象序列化为XML格式字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string GetString(object obj)
{
string result = string.Empty;
if (obj ==null)
{
return result;
} XmlSerializer serializer =new XmlSerializer(obj.GetType());
using (MemoryStream stream =new MemoryStream())
{
serializer.Serialize(stream, obj);
byte[] buffer = stream.ToArray();
result = this.Encoding.GetString(buffer);
stream.Close();
} return result;
} ///<summary>
/// 将XML格式字符串转化为对象
///</summary>
public T GetObject<T>(string xmlString)
{
T obj = default(T);
if (string.IsNullOrEmpty(xmlString))
{
return obj;
} XmlSerializer serializer =new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(this.Encoding.GetBytes(xmlString)))
{
obj = (T)serializer.Deserialize(stream);
stream.Close();
} return obj;
}
}

整个过程就这样子,当然中间肯定运行多次测试来即时修正编码过程中的错误。篇幅有限,我在这里并没有编写构造函数的测试方法。

  

【后话】

  如此一来以后再添加对接口的更多实现时,保证了不再需要编写大量重复的测试代码,例如再增加类JsonFormatter时就轻而易举的完成它的单元测试,后期开发效率与质量均得到保证。

  编写完毕,借此抛砖引玉,希望得到您更好的意见,鲜花鸡蛋均欢迎。

VS2012 Unit Test —— 我对接口进行单元测试使用的技巧的更多相关文章

  1. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  2. VS2012 Unit Test 个人学习汇总(含目录)

    首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...

  3. VS2012 Unit Test——Microsoft Fakes入门

    如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...

  4. VS2012 Unit Test

    VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...

  5. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  6. 使用IdleTest进行TDD单元测试驱动开发演练(1)

    [前言] 开发工具:Visual Studio 2012 测试库:Visual Studio 2012自带的MSTest DI框架:Unity 数据持久层:Entity Framework 前端UI: ...

  7. .NET重构—单元测试重构

    .NET重构—单元测试重构 阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1 ...

  8. 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    VS2012 Unit Test(Void, Action, Func) —— 对无返回值.使用Action或Func作为参数.多重载的方法进行单元测试 [提示] 1. 阅读文本前希望您具备如下知识: ...

  9. unit vs单元测试

    vs单元测试(unit) 一.什么是单元测试及它的作用? 在小量代码编写时,往往可以通过新建控制台项目(Console Application),新建网站项目(Web Form)等,在其中敲入测试代码 ...

随机推荐

  1. jQuery2.0.3源码分析系列(28) 元素大小

    最近的分析都是有点不温不火,基本都是基础的回顾了 今年博客的目标目前总的来说有2大块 JS版的设计模式,会用jQuery来诠释 JS版的数据结构,最近也一直在狠狠的学习中. HTML息息相关的的样式 ...

  2. JAVA基础代码分享--DVD管理

    问题描述 为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理. 管理器具备的功能主要有: 1.查看DVD信息. 菜单选择查看功能,展示DVD的信息. 2.新增DVD信息 选择新增功 ...

  3. Android之startService()和bindService()区别

    1. 生命周期: startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart().当用户在发出意图使之销毁时会经历onDestroy(), ...

  4. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  5. karma单元测试入门

    学习angularjs,都会遇到karma单元测试,可是初学者面对复杂的测试配置往往不知从何入手,下面我们将抛开angularjs,单独使用两个js文件,完成一次测试入门. 0,karma原理

  6. canvas学习(一)

    Canvas 学习之路 (一) canvas 是H5 里面神一样的东西,使得只是通过html和js就能做出非常棒的游戏和画面. 因为对前端无限的爱好,更加对canvas充满好奇,将我学习canvas的 ...

  7. JSON学习

    1.JSON 语法是 JavaScript 对象表示语法的子集. l  数据在名称/值对中 l  数据由逗号分隔 l  花括号保存对象 l  方括号保存数组 JSON 值可以是: l  数字(整数或浮 ...

  8. machine learning基础与实践系列

    由于研究工作的需要,最近在看机器学习的一些基本的算法.选用的书是周志华的西瓜书--(<机器学习>周志华著)和<机器学习实战>,视频的话在看Coursera上Andrew Ng的 ...

  9. WebSocket 学习(三)--用nodejs搭建服务器

    前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...

  10. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...