2012-01-20 10 views
0

私は、HttpContextBaseを継承し、私のコントローラに注入されるオブジェクトを作成して、asp.net mvcコードを単体テストしています。それは素晴らしい作品のURL、リファラ、ユーザーエージェント、クッキーなど: フェデレーションID:テスト目的でhttpContextを挿入する方法は?

myfooController.ControllerContext.HttpContext = new FakeHttpContext(); 

こうすることによって、私はasp.netのproperiesの多種多様を模擬することができます。

私は、RelyingPArty署名リクエストをデコードし、適切に処理するFederatedIdentityコントローラをカバーするための単体テストを作成しています。私のFakeHttpContextは、nullサインインリクエスト、悪い共有シークレットなどのさまざまなシナリオをテストできます。

私たちの現在のWIFプロジェクトでは、静的クラスFederatedAuthentication.SessionAuthenticationModule.CookieHandlerを呼び出してクッキーを行う必要がありますもの。

私のユニットテストでこれを行うと、HttpContext.Currentがnullであるため、爆発します。 SessionAuthenticationModuleはHttpContext.Currentを使用するように見えますが、私の偽のコンテキストに設定することはできません。 HttpContext.CurrentはHttpContextBaseから継承しないので、関連するプロパティを設定して、有用なテストを行うことはできません。

2011年、マイクロソフトの誰かが、完全に完全にユニットテスト可能ではない非常に重要な認証コードを作成したと私は結論づけましたか?本当に?

答えて

0

どのように実際の認証を処理していますか?

セッションオブジェクトとクレーム認証オブジェクトが有効ですか?

SelfSTSは、説明したような単体テストシナリオで非常に便利です。

+0

コアの問題が解決されたわけではありませんが、SelfSTSは束のテストに役立ちます。 –

0

Scott Hanselmanがこのarticleをご覧ください。彼はのHttpContextと他の目的(例えばFileUploads)のための他のASP.NETアーティファクトのモックを示しているが、私は同じ技術を使用します。基本的に

var user = new Mock<IPrincipal>(); 
user.Setup(p => p.Identity.IsAuthenticated).Returns(true); 

var context = new Mock<HttpContextBase>(); 
context.Setup(ctx => ctx.User) 
     .Returns(user.Object); 

var controllerContext = new Mock<ControllerContext>(); 
controllerContext.Setup(con => con.HttpContext) 
       .Returns(context.Object); 

var c = new YourController(); 
c.ControllerContext = controllerContext.Object; 

.... 

をIかかわらWIFに対するおそらくないユニットテストだろう。

+0

ええ、それは偽のコンテキストのインスピレーションがどこから来たかです。問題はコントローラのコンテキストを大きく設定することですが、SessionAuthenticationModuleはHttpContext.Currentを使用するように見えますが、これを私の偽のコンテキストに設定することはできません。 grrr! –

関連する問題