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


王德水

相关文章
|
1月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
28 1
|
2月前
|
测试技术
包含用例执行时间的测试报告代码
包含用例执行时间的测试报告代码
|
4月前
com串口通信测试代码
com串口通信测试代码
28 0
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
36 0
|
17天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
1月前
|
测试技术 数据库 Python
python测试代码(二)
python测试代码(二)
19 0
|
1月前
|
Java 测试技术
单元测试编写可测试代码
单元测试编写可测试代码
19 2
|
2月前
|
存储 测试技术
统计测试结果的代码实现接昨天
统计测试结果的代码实现接昨天
|
3月前
|
网络协议 Linux C语言
C语言-多播测试代码(IPv4和IPv6)
C语言-多播测试代码(IPv4和IPv6)
35 0
|
4月前
|
SQL Oracle 关系型数据库
助力工业物联网,工业大数据之ODS层构建:申明分区代码及测试【十】
助力工业物联网,工业大数据之ODS层构建:申明分区代码及测试【十】
44 0