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如需转载请自行联系原作者


    王德水

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/twodog/p/12138212.html
Copyright © 2011-2022 走看看