• 对包含HttpContext.Current.Cache的代码进行单元测试


    假设我们如下代码调用了HttpContext.Current.Cache

    public class CacheManager
    {
      public static HttpContext mHttpContext = HttpContext.Current;
    
      public void SetCache(string key, T value)
      {
         mHttpContext.Cache.Insert(key, value, null, DateTime.MaxValue, new TimeSpan(0, 100, 0));
      }
    
      public T GetCache(string key)
      {
         return (T)mHttpContext.Cache.Get(key);
      }
    
    }
    现在我有一个类调用了上面的GetCache<T>
    public class LanguageController
    {
        private CacheManager cacheManger = new CacheManager();
      
        public string Get_UserLanguage()
        {
            string userLanguage=cacheManger.GetCache("userLanguage");
    
            if (!string.IsNullOrEmpty(userLanguage)) return userLanguage;
    
            return "zh-CN";
        }        
    }
    我们现在需要测LanguageController的Get_UserLanuage,写如下代码

    [TestMethod]
    public void Test_Get_UserLanguage()
    {
    
      CacheManager cacheManger = new CacheManager();
      cacheManger.SetCache("userLanguage", "en-GB");
    
      LanguageController languageController = new LanguageController();
    
      Assert.AreEqual(languageController.Get_UserLanguage(), "en-GB");
    
     }
    运行测试,失败,得到如下消息

    System.NullReferenceException: Object reference not set to an instance of an object.

    跟踪调试,发现下面方法这句mHttpContext.Cache为空

    public void SetCache(string key, T value)
    {
       mHttpContext.Cache.Insert(key, value, null, DateTime.MaxValue, new TimeSpan(0, 100, 0));
    }
    现在,将测试代码改为如下:
    [TestMethod]
    public void Test_Get_Language_By_Fake()
    {
      HttpContext.Current = new HttpContext(new HttpRequest(null, 
           "http://10.10.50.127/RGV2/devtest1", null), new HttpResponse(null));
    
      CacheManager.mHttpContext = HttpContext.Current;
    
      CacheManager cacheManger = new CacheManager();
    
      cacheManger.SetCache("userLanguage", "en-GB");
    
      LanguageController languageController = new LanguageController();
    
      Assert.AreEqual(languageController.Get_UserLanguage(), "en-GB");
    
    }
    测试通过:
    image 
    总结,当我们测试的包含HttpContext.Current.Cache代码时:
    1. 将HttpContext.Current.Cache 公布为类的静态属性,这样测试时,一个地方改了,全部就改过来了
    2. 用下面的代码来给HttpContext.Current赋值
    HttpContext.Current = new HttpContext(new HttpRequest(null, 
                            "http://10.10.50.127/RGV2/devtest1", null), new HttpResponse(null));
    
    CacheManager.mHttpContext = HttpContext.Current;
    3. 建议所有调用HttpContext获得值的地方,尽量公布为属性,这样方便测试,比如如下的代码我们就直接赋值了,这个和本文关系不大,只是一个实践而已。
    public class ConfigController 
     {
        private string tempConfigPath;
        public string mConfigPath
        {
            get
            {
                if (tempConfigPath == null)
                {
                    tempConfigPath = HttpContext.Current.Server.MapPath(@"~/App_Data/config.xml");
                }
                return tempConfigPath;
            }
            set
            {
                tempConfigPath = value;
            }
        }
    }
    4. 我们也可以使用Mock,但是个人认为上面的方法更简单点。

     

  • 相关阅读:
    oracle之 RAC Interconnect之HAIP
    oracle12c之 单机12.1.0.1打补丁
    oracle之 oracle database vault(数据库保险库)
    oracle之 12.1.0.1.0 C 在 linux 7 上安装报错处理
    Linux之 xstart调用 x11vnc远程图形化桌面
    oracle之 利用 controlfile trace文件重建控制文件
    oracle之 v$sql_monitor 监视正在运行的SQL语句的统计信息
    用oradebug short_stack及strace -p分析oracle进程是否dead或出现故障
    oralce之 10046对Hash Join分析
    嵌套Golang对象的初始化
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1539788.html
Copyright © 2020-2023  润新知