使用HttpContext.Application进行单元测试

时间:2015-10-30 16:27:38

标签: c# unit-testing

我正在尝试对从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;

1 个答案:

答案 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中交换进出不同的版本。