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