对包含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");}
测试通过:
总结,当我们测试的包含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的代码进行单元测试相关推荐
- Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache
在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...
- HttpContext.Current.Cache 过期时间
HttpContext.Current.Cache 过期时间 原文:HttpContext.Current.Cache 过期时间 为了更快的读取数据,我们一般会把常用到的数据加载到Cache中 在.N ...
- HttpContext.Current.Cache vs. HttpRuntime.Cache
.NET中Cache有两种调用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache,这两种方式有什么区别呢?我们先看MSDN上的解释: Http ...
- HttpContext.Current.Cache和HttpRuntime.Cache的区别,以及System.Runtime.Caching
先看MSDN上的解释: HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象. HttpRuntime.Cache:获取当前应用程序的C ...
- 缓存通用管理类 + 缓存 HttpContext.Current.Cache 和 HttpRuntime.Cache 的区别
以前写asp.net时用HttpContext.Current.Cache存缓存很好用,今天写了一个windows服务程序,HttpContext.Current.Cache存缓存的时候还好,取的时候 ...
- HttpContext.Current.Cache在控制台下不工作
说明: Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体 ...
- 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)...
在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在 ...
- HttpContext 来源(System.Web.HttpContext.Current值为null的问题)
转大神文档:https://www.cnblogs.com/linJie1930906722/p/5708966.html ASP.NET提供了静态属性System.Web.HttpContext.C ...
- Why is HttpContext.Current null after await?
今天在对项目代码进行异步化改进的时候,遇到一个奇怪的问题(莫笑,以前没遇过),正如标题一样,HttpContext.Current 在 await 异步执行之后,就会变为 null. 演示代码: pu ...
- WCF中使用HttpContext.Current的办法
正常方法创建的WCF服务,就是在asp.netk中的.SVC后缀的 是无法使用httpcontext.current等信息的 解决办法就是在服务前加上个标识:[AspNetCompatibilityR ...
最新文章
- 机房收费系统【VB版】——选择下机
- Ant Design of React从入门到开发教程
- 更简单的调试Release版本Optimize code的.NET程序集
- 星巴克和阿里“结婚”,这后面真的不简单
- DPDK — PDUMP 抓包工具
- 实时流处理系统容错机制(二):Apache Flink 基于State的异步容错机制
- vue键盘事件:@keyup.down下方向键绑定事件
- unity调用php,unity访问php
- 记录jquery的ajax
- 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
- c语言 获取硬盘号,C语言获得硬盘序列号
- 我国计算机操作系统开发历史及现状(软件学报格式的本文WORD文档在作者主页)
- 修改或删除脚注或尾注的“横线”
- 《深入理解计算机系统》|处理器体系结构
- UML需求分析步骤实例解析
- 如何用excel筛选相似内容_excel表格怎么筛选相同内容
- 在系统grub.cfg里面设定关闭 aspm
- CC2540\CC2541 资料整理
- 自动驾驶汽车测试技术与应用进展
- ICMP有哪些消息类型?常见的ICMP报文有哪些?
热门文章
- jquery ajax修改密码,提交form表单---修改密码 ajax、jQuery
- c语言随机抽取小程序_c++ c语言编写抽学号小程序
- JavaSE基础——IO流详解(2)其他常用的流和Properties 集合
- 数据结构和算法——八种常用的排序算法------归并排序
- 分布有限传输速度高的计算机网络,第5章 计算机网络基础.ppt
- ajax 详解(GET,POST方式传输以其封装)
- linux 创建用户/添加用户/用户组添加修改删除(ubuntu/centos)
- Linux 查找进程与结束进程
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
- 小战Java笔记_SE_Identifier(标识符)