2012-01-17 3 views
3

Ссылка на this question и, в частности, this answer, проголосовавших, но не отмеченных. Мне не нравится отмеченный ответ, потому что мне нужно провести тестирование контроллера.Является ли это по-прежнему рекомендуемым способом модульного тестирования с API, для которого требуются HttpRequest и HttpResponse?

Внесение этих данных в HttpRequest и HttpResponse во время Application_BeginRequest немного пахнет, но я имею дело с ComponentSpace SAML 2 library, который принимает эти типы в качестве аргументов метода. Нет ли лучшего способа получить доступ к ним в MVC с возможностью тестирования?

Вот что я сейчас работаю. Может рефакторить .items из в метод расширения для инкапсуляции бросание и волшебную строку, но это основная идея:

Global.asax:

protected void Application_BeginRequest() 
{ 
    // put the raw request in context items for use by ComponentSpace SAML lib 
    Context.Items["HttpRequest"] = Context.Request; 
    Context.Items["HttpResponse"] = Context.Response; 
} 

методов обслуживания:

// HttpContext is an instance of HttpContextBase 
ServiceProvider.SendAuthnRequestByHTTPPost(
    HttpContext.Items["HttpResponse"] as HttpResponse, 
    authnRequest.Destination, authnRequestXml, relayState); 

ServiceProvider.ReceiveSAMLResponseByHTTPPost(
    HttpContext.Items["HttpRequest"] as HttpRequest, 
    out samlResponseXml, out relayState); 
+1

_I не нравится отмеченная answer_ почему вы не начать щедрость в этой теме? –

+1

@ sh4nx0r, таким образом было дешевле. – danludwig

ответ

0

Я не понимаю необходимость в следующей строке в вашем начать запрос

Context.Items["HttpRequest"] = Context.Request; 

Если ваша потребность только следующая строка

HttpContext.Items["HttpRequest"] as HttpRequest, 

Вы можете получить тот же эффект, выполнив следующие действия

HttpContext.Current.Request 
+0

HttpContext - это экземпляр System.Web.HttpContext, но MVC имеет дело с System.Web.HttpContextBase. Я бы предпочел выполнить единичный тест против базовых реализаций, а не для старых школьных реализаций. – danludwig

+0

Я немного смущен, когда вы предлагаете HttpContext.Items является единицей, подлежащей тестированию, но HttpContext.Current.Request не является – chandmk

+0

Наши юниверсы уже обманывают HttpContextBase на controlContext. HttpContextBase.Request - это экземпляр HttpRequestBase, а не HttpRequest. Поместив запрос в коллекцию HttpContext.Items, мы можем быть уверены, что HttpContextBase имеет ссылку на него вместо экземпляра HttpRequestBase. Вы предлагаете нам также издеваться над HttpContext.Current для наших модульных тестов? В дополнение к издевательскому контроллеруContext.HttpContext? – danludwig