我们在开发,有时遇到一些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 Blog。

相关文章:

  • 2022-12-23
  • 2021-11-24
  • 2021-08-21
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-08
  • 2022-12-23
  • 2022-12-23
  • 2017-12-22
  • 2022-12-23
  • 2021-09-08
相关资源
相似解决方案