我正在尝试对从HttpContext.Current.Application
读取值的一些代码进行单元测试,但它仍然失败,因为它无法检索该值。
我尝试创建自己的HttpContext
,为其设置HttpContext.Current
,然后向其中写入值,但似乎不存储新值。
代码引用HttpContext.Current.Application
public static void UpdateApplicationVariable(string keyToUpdate, object toSave)
{
HttpContext.Current.Application.Lock();
HttpContext.Current.Application[keyToUpdate] = toSave;
HttpContext.Current.Application.UnLock();
}
public static object GetApplicationVariable(string keyToReturn)
{
return HttpContext.Current.Application[keyToReturn];
}
设置代码
HttpContext.Current = new HttpContext(
new HttpRequest(null, "http://tempuri.org", null),
new HttpResponse(null)
);
UpdateApplicationVariable("GeneralSettings", new GeneralSettings()
{
NumberDecimalPlaces = 2
});
//settings is null
GeneralSettings settings = GetApplicationVariable("GeneralSettings") as GeneralSettings;
答案 0 :(得分:1)
<强> Fiddle 强> !!!!他不喜欢被嘲笑!
而是弄清楚你想要实现的功能是什么,并围绕它设计一个抽象。这将使您的代码更易于测试,因为它与onCreate()
没有紧密耦合。
HttpContext
在您的代码中,引用public interface IApplicationSettings {
object this[string key] { get; set; }
}
可以更改...
HttpContext.Current.Application
具体版本将包含访问public static class SomeUtilityClass {
public static IApplicationSettings Application {get;set;}
public static void UpdateApplicationVariable(string keyToUpdate, object toSave)
{
Application[keyToUpdate] = toSave;
}
public static object GetApplicationVariable(string keyToReturn)
{
return Application[keyToReturn];
}
}
所需的实际代码。有点像...
HttpContext
现在在您的代码设置中进行测试,您可以使用抽象的模拟,伪造或存根版本完全放弃HttpContext ...
public class ConcreteApplicationSettings : IApplicationSettings {
public string this[string keyToReturn] {
get {
return HttpContext.Current.Application[keyToReturn];
}
set {
HttpContext.Current.Application.Lock();
HttpContext.Current.Application[keyToUpdate] = value;
HttpContext.Current.Application.UnLock();
}
}
}
在生产代码中,您将使用实际版本而不是假货。如果您决定使用其他内容来存储变量,这也允许您在fusture中交换进出不同的版本。