我们在开发,有时遇到一些Legcy代码,然后需要对它们进行UnitTest。UnitTest的重要性在这里不再说了。但是发现某些Class中有些方法是Static的,按以往的方法我们需要用
Extact Interface 方法 从那个需要测试的Class,然后使用 IOC /DI 的方式替换具体的实现,用一个Fake Class或Mock 一个实现来完成 UnitTest。现在我们可以使用Moles 对静态方法做UnitTest。看下面的示例:

        假设有这个样的Class:

   1:      public class SomeClass
   2:      {
   3:          private int AddTenItem(int num)
   4:          {
   5:              return num + 10;
   6:          }
   7:   
   8:          private static int AddTwentyItem(int num)
   9:          {
  10:              return num + 20;
  11:          }
  12:   
  13:          public static string GetMessage(string msg)
  14:          {
  15:              return string.Format("--{0}--", msg);
  16:          }
  17:   
  18:          public string GetTotalItem(int num)
  19:          {
  20:              return string.Format("{0}", AddTenItem(num) + AddTwentyItem(num)) ;
  21:          }
  22:      }

         从上面方法我们看到一个GetMessage静态方法,下面看用UnitTest如何测试它。你需要先下载安装Moles从官方网站,然后在VS2010中通过Project的 Reference右键菜单 在需要Mock Assembly,选择”Add Moles Assembly” ,它会自动生成一个 “SomeNameAssembly.Moles”程序集。编写下面的单元测试Code:

   1:          [TestMethod]
   2:          [HostType("Moles")]
   3:          public void TestGetMessageWithMoles()
   4:          {
   5:              //arrange
   6:              MSomeClass.GetMessageString = (str) => str + "--";
   7:   
   8:              //act
   9:              var result = SomeClass.GetMessage("test");
  10:   
  11:              //assert
  12:              Assert.AreEqual("test--", result);
  13:          }

需要增加一个Attribtue [HostType(“Moles”)] 对于MsTest,MSomeClass是Moles生成的并自动引用于Project上了,如上面代码你可以看到我们可以Mock 这个方法的实现了。 对于private的方法也可以,看下面的代码:

   1:          [TestMethod]
   2:          [HostType("Moles")]
   3:          public void TestPrivateMethodWithMoles()
   4:          {
   5:              //arrange
   6:              MSomeClass.AddTwentyItemInt32 = (i) => i + 2;
   7:              MSomeClass.AllInstances.AddTenItemInt32 = (SomeClass, i) => i + 1;
   8:              
   9:              //act
  10:              string result = new SomeClass().GetTotalItem(1);
  11:   
  12:              //assert
  13:              Assert.AreEqual("5", result);
  14:          }

就这么简单,上面的代码我们指定两个Private方法delegate,一个是Static method,另一个是Instance method,这里标记是AllInstances。 然后Call那个Public的方法,最后Assert。它们无缝地你的真正方法整合在一起做UnitTest。

希望对您的开发有帮助。


作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog

posted on 2011-08-09 15:19  PetterLiu  阅读(1080)  评论(0编辑  收藏  举报