zoukankan      html  css  js  c++  java
  • 使用Moles对静态方法做UnitTest

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

  • 相关阅读:
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    Centos安装openjdk
    centos7安装nodejs
    Linux服务器集群性能监控之Performance Co-Pilot(PCP)部署
    asp.net(c#)网页跳转七种方法小结
    C# 获取文件名及扩展名
    C#中的 具名参数 和 可选参数
    数据契约(DataContract)
    用LINQ在集合中查询特定对象
    jQuery中append、insertBefore、after与insertAfter方法注意事项
  • 原文地址:https://www.cnblogs.com/wintersun/p/2132340.html
Copyright © 2011-2022 走看看