【题外话】

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

在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. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  2. 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(3)

    设置自定义的入口程序体现应用本身与应用托管之间的分离,它使我们可以创建独立于托管环境的应用,并根据需要寄宿于任何一个我们希望的宿主程序下,对于Web应用来说这一点尤为重要.对于之前的Web应用来说,I ...

  3. Ubuntu杂记——Ubuntu下用虚拟机共享上网

    由于最近把自己电脑环境换成了Ubuntu,但学校的网络是电信的闪讯,大学里用过的人都知道这货有多坑,而且没有Linux客户端,上网都是问题,怪不得国内用Linux的人那么少,特别是高校的学生(让我瞎逼 ...

  4. JavaScript框架设计(四) 字符串选择器(选择器模块结束)

    JavaScript框架设计(四) 字符串选择器(选择器模块结束) 经过前面JavaScript框架设计(三) push兼容性和选择器上下文的铺垫,实现了在某一元素下寻找,现在终于进入了字符串选择器 ...

  5. ZOJ Problem Set - 1001 A + B Problem

    ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...

  6. 《HelloGitHub月刊》第07期

    最近工作上的事比较多,<HelloGitHub>月刊第07期拖到月底才发. 本期月刊对logo和月刊的排版进行了优化,不知道大家的反馈如何,还望大家多多反馈,让<HelloGitHu ...

  7. WebGIS中一种根据网格索引判断点面关系的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 判断点面关系的算法有很多,在我之前的博文中有一篇专门对其进行 ...

  8. composer安装yii2问题总结

    今天周六,在家安装yii2的advanced版本, 过程有些坎坷, 不过最后总算安装好了. 总结一下, 主要遇到下面两个问题: 1, 下载速度慢, 主要原因是网络问题 下载yii2时, 模板(除了ve ...

  9. 【JVM】JVM系列之JVM体系(一)

    一.前言 为什么要学习了解Java虚拟机 1.我们需要更加清楚的了解Java底层是如何运作的,有利于我们更深刻的学习好Java. 2.对我们调试错误提供很宝贵的经验. 3.这是合格的Java程序必须要 ...

  10. Apache 创建虚拟主机目录和设置默认访问页面

    虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同 ...