2012-01-17 2 views
3

リファレンスthis questionと投票しますがマークされていない、具体的this answerにあります。コントローラを単体テストする必要があるので、私はマークされた答えが嫌いです。これは、HttpRequestとHttpResponseを必要とするAPIでのユニットテストの推奨方法ですか?

Application_BeginRequest中にこれらをHttpRequestとHttpResponseに入れるのは少し匂いがありますが、私は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

ではないことを示唆しているときは少し混乱します。私たちのユニットテストは、すでにcontrollerContextでHttpContextBaseを模擬テストしています。 HttpContextBase.Requestは、HttpRequestBaseのインスタンスであり、HttpRequestではありません。要求をHttpContext.Itemsコレクションに入れることで、HttpContextBaseがHttpRequestBaseのインスタンスではなくHttpContextBaseへの参照を持つことが保証されます。私たちが単体テストのためにHttpContext.Currentをモックすることを提案していますか? controllerContext.HttpContextを嘲笑することに加えて? – danludwig

関連する問題