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


    王德水

  • 相关阅读:
    《JAVA与模式》之备忘录模式
    《JAVA与模式》之调停者模式
    如何将GTK+2.0的信号、回调处理映射成类成员函数的调用VC中测试(单类继承)
    第一个GTK程序:中国农历 附录2 libtool
    【转载】成员函数指针与高性能的C++委托
    第一个GTK程序:中国农历 附录4 动态库
    第一个GTK程序:中国农历 附录3 静态库
    【转载】C++中实现委托(Delegate)
    如何将GTK+2.0的信号、回调处理映射成类成员函数的调用VC中测试(虚拟继承类及多继承)
    第一个GTK程序:中国农历 附录5 变量名
  • 原文地址:https://www.cnblogs.com/twodog/p/12138215.html
Copyright © 2020-2023  润新知