zoukankan      html  css  js  c++  java
  • 对包含HttpContext.Current.Cache的代码进行单元测试

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [TestMethod]
    public void Test_Get_UserLanguage()
    {
     
      CacheManager cacheManger = new CacheManager();
      cacheManger.SetCache<string>("userLanguage", "en-GB");
     
      LanguageController languageController = new LanguageController();
     
      Assert.AreEqual(languageController.Get_UserLanguage(), "en-GB");
     
     }</string>
    运行测试,失败,得到如下消息

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

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

    1
    2
    3
    4
    public void SetCache<t>(string key, T value)
    {
       mHttpContext.Cache.Insert(key, value, null, DateTime.MaxValue, new TimeSpan(0, 100, 0));
    }</t>
    现在,将测试代码改为如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [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<string>("userLanguage", "en-GB");
     
      LanguageController languageController = new LanguageController();
     
      Assert.AreEqual(languageController.Get_UserLanguage(), "en-GB");
     
    }</string>
    测试通过:
     
    总结,当我们测试的包含HttpContext.Current.Cache代码时:
    1. 将HttpContext.Current.Cache 公布为类的静态属性,这样测试时,一个地方改了,全部就改过来了
    2. 用下面的代码来给HttpContext.Current赋值
    1
    2
    3
    4
    HttpContext.Current = new HttpContext(new HttpRequest(null,
                            "http://10.10.50.127/RGV2/devtest1", null), new HttpResponse(null));
     
    CacheManager.mHttpContext = HttpContext.Current;
    3. 建议所有调用HttpContext获得值的地方,尽量公布为属性,这样方便测试,比如如下的代码我们就直接赋值了,这个和本文关系不大,只是一个实践而已。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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,但是个人认为上面的方法更简单点。

     本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2009/08/05/1539788.html如需转载请自行联系原作者


    王德水

  • 相关阅读:
    Git 使用vi或vim
    git 添加远程仓库后无法push
    windows下使用IIS创建git服务
    NPOI 操作office、word、excel
    delphi 模拟POST提交数据
    git 用远程覆盖本地
    Delphi中MD5实现方法(转)
    Delphi 操作Ini文件
    Spring系列之——spring security
    Spring系列之——使用模板快速搭建springboot项目
  • 原文地址:https://www.cnblogs.com/twodog/p/12138212.html
Copyright © 2011-2022 走看看