【题外话】
对单元测试不熟悉的童鞋可参照我之前写过的两篇博文:
以下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(123); string str = formatter.GetString(ep); EntityParameter actual = formatter.GetObject<EntityParameter>(str); Assert.IsNotNull(actual); Assert.AreEqual<int>(123, 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(12)); AssertCommon.AssertEmpty<string>(actual, false); EntityParameter entity = formatter.GetObject<EntityParameter>(actual); Assert.AreEqual<int>(12, entity.Data); }