2012-06-19 6 views
1

Я пытаюсь написать некоторые модульные тесты для нескольких мертонов, которые зависят от объекта HttpContext. Я придумал следующий класс, но я не думаю, что это лучший способ сделать это.Модуль Тестирование Webform HttpContext Зависимый код?

internal class HttpContextMocking 
{ 

    public static HttpContext Context() 
    { 

     HttpContext context = new HttpContext(new SimpleWorkerRequest("", "", "", null, new StringWriter())); 

     context.Cache.Insert("SomeName", "value", null, DateTime.Now.AddMinutes(3), TimeSpan.Zero); 

     return context; 
    } 

Я тогда называть этот макет HttpContext в моем тестовом модуле следующим образом:

[TestMethod] 
    [TestCategory("Web")] 
    public void Get() 
    { 
     HttpContext.Current = HttpContextMocking.Context(); 

     object result = CacheUtility.Get("NonExistentItem"); 

     Assert.IsNull(result); 
    } 

есть лучший способ реализации этого, то, что будет чище, когда я начинаю добавить еще манекен данные.

ответ

1

HttpContext действительно сложный, чтобы издеваться. Я предлагаю изменить зависимость от интерфейса, который обеспечивает то, что вам нужно, а затем иметь две реализации: настоящую, используя HttpContext и Mock для тестов.

Если вы все равно хотите издеваться над этим, и ваш код делает трюк, оставьте его таким образом.

Другой вариант - использовать тип хоста ASP.NET для MSTest. В этом случае, вы будете выполнять фактический запрос и ваш HttpContext будет там:

[TestMethod] 
[HostType("ASP.NET")] 
[AspNetDevelopmentServerHost(@"$(SolutionDir)\Tests", "/")] 
[UrlToTest("http://localhost:1234/TestPage.aspx")] 
public void MyTest() 
{ 
    Page page = testContextInstance.RequestedPage; 
    ... 
} 
Смежные вопросы