• 对包含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 11g常用管理命令(用户、表空间、权限)
    在 .NET 中使用 FixedTimeEquals 应对计时攻击
    开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用
    C# 数字证书 RSA加密解密 加签验签
    C#获取Unix时间戳
    react 带行号的文本框的使用方案
    ThinkPad电池处会发出“吱吱”电流声怎么办
    使用C#和MonoGame开发俄罗斯方块游戏
    C# 通过word模板动态生成Word
    云原生那些顶级开源项目,你都用过哪些?
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1539788.html
Copyright © 2020-2023  润新知