【题外话】

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

在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. 前端MVC框架Backbone 1.1.0源码分析(二) - 模型

    模型是什么? Models are the heart of any JavaScript application, containing the interactive data as well a ...

  2. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  3. 为什么要学习Linux

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 本篇修改自我在知乎上回答的问题,为什么要学习 Linux? 我最开始用Linux是 ...

  4. C# 如何将List拆分成多个子集合

    网上的例子: 问:List<string> list = new List<string>();        for (int i = 1; i < 95; i++)  ...

  5. EF CodeFirst EntityTypeConfiguration 自关联映射配置

    实体示例代码: public class Message { public Message() { } public int ID { get; private set; } public strin ...

  6. 去哪儿搜索引擎QSearch设计与实现

    本次演讲主要介绍的是QSearch的具体设计和应用场景,并分别解答以下几个问题:QSearch与开源垂直软件Lucene的区别:具体业务的实现技巧.以及QSearch的具体设计:如何通过Partial ...

  7. 【原创】kafka consumer源代码分析

    顾名思义,就是kafka的consumer api包. 一.ConsumerConfig.scala Kafka consumer的配置类,除了一些默认值常量及验证参数的方法之外,就是consumer ...

  8. jQuery获取及设置单选框、多选框、文本框内容

    获取一组radio被选中项的值 var item = $('input[@name=items][@checked]').val(); 获取select被选中项的文本 var item = $(&qu ...

  9. SharePoint创建web application出现“The password supplied with the username was not correct”错误的解决方法

    平台环境 Windows Server 2012 R2 Standard, SharePoint Server 2010, Microsoft SQL Server 2012 (SP1) 问题描述 在 ...

  10. EC笔记,第二部分:8.别让异常逃离析构函数

    1.为何析构函数不应该抛出异常?    有两种情况:    1).假设析构函数中有众多语句,而第一条语句抛出异常(或者其他语句),那么抛出异常以后的语句就得不到执行.而通常我们在析构函数中写的是清理资 ...