假设我们如下代码调用了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 >
|
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如需转载请自行联系原作者
王德水