假设我们如下代码调用了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");}
测试通过:

 

总结,当我们测试的包含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,但是个人认为上面的方法更简单点。

转载于:https://www.cnblogs.com/cnblogsfans/archive/2009/08/05/1539788.html

对包含HttpContext.Current.Cache的代码进行单元测试相关推荐

  1. Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

    在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...

  2. HttpContext.Current.Cache 过期时间

    HttpContext.Current.Cache 过期时间 原文:HttpContext.Current.Cache 过期时间 为了更快的读取数据,我们一般会把常用到的数据加载到Cache中 在.N ...

  3. HttpContext.Current.Cache vs. HttpRuntime.Cache

    .NET中Cache有两种调用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache,这两种方式有什么区别呢?我们先看MSDN上的解释:       Http ...

  4. HttpContext.Current.Cache和HttpRuntime.Cache的区别,以及System.Runtime.Caching

    先看MSDN上的解释:       HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象.       HttpRuntime.Cache:获取当前应用程序的C ...

  5. 缓存通用管理类 + 缓存 HttpContext.Current.Cache 和 HttpRuntime.Cache 的区别

    以前写asp.net时用HttpContext.Current.Cache存缓存很好用,今天写了一个windows服务程序,HttpContext.Current.Cache存缓存的时候还好,取的时候 ...

  6. HttpContext.Current.Cache在控制台下不工作

    说明: Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体 ...

  7. 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)...

    在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在 ...

  8. HttpContext 来源(System.Web.HttpContext.Current值为null的问题)

    转大神文档:https://www.cnblogs.com/linJie1930906722/p/5708966.html ASP.NET提供了静态属性System.Web.HttpContext.C ...

  9. Why is HttpContext.Current null after await?

    今天在对项目代码进行异步化改进的时候,遇到一个奇怪的问题(莫笑,以前没遇过),正如标题一样,HttpContext.Current 在 await 异步执行之后,就会变为 null. 演示代码: pu ...

  10. WCF中使用HttpContext.Current的办法

    正常方法创建的WCF服务,就是在asp.netk中的.SVC后缀的 是无法使用httpcontext.current等信息的 解决办法就是在服务前加上个标识:[AspNetCompatibilityR ...

最新文章

  1. 机房收费系统【VB版】——选择下机
  2. Ant Design of React从入门到开发教程
  3. 更简单的调试Release版本Optimize code的.NET程序集
  4. 星巴克和阿里“结婚”,这后面真的不简单
  5. DPDK — PDUMP 抓包工具
  6. 实时流处理系统容错机制(二):Apache Flink 基于State的异步容错机制
  7. vue键盘事件:@keyup.down下方向键绑定事件
  8. unity调用php,unity访问php
  9. 记录jquery的ajax
  10. 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
  11. c语言 获取硬盘号,C语言获得硬盘序列号
  12. 我国计算机操作系统开发历史及现状(软件学报格式的本文WORD文档在作者主页)
  13. 修改或删除脚注或尾注的“横线”
  14. 《深入理解计算机系统》|处理器体系结构
  15. UML需求分析步骤实例解析
  16. 如何用excel筛选相似内容_excel表格怎么筛选相同内容
  17. 在系统grub.cfg里面设定关闭 aspm
  18. CC2540\CC2541 资料整理
  19. 自动驾驶汽车测试技术与应用进展
  20. ICMP有哪些消息类型?常见的ICMP报文有哪些?

热门文章

  1. jquery ajax修改密码,提交form表单---修改密码 ajax、jQuery
  2. c语言随机抽取小程序_c++ c语言编写抽学号小程序
  3. JavaSE基础——IO流详解(2)其他常用的流和Properties 集合
  4. 数据结构和算法——八种常用的排序算法------归并排序
  5. 分布有限传输速度高的计算机网络,第5章 计算机网络基础.ppt
  6. ajax 详解(GET,POST方式传输以其封装)
  7. linux 创建用户/添加用户/用户组添加修改删除(ubuntu/centos)
  8. Linux 查找进程与结束进程
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
  10. 小战Java笔记_SE_Identifier(标识符)