联合身份:如何为测试目的注入httpContext?

时间:2012-01-20 22:35:42

标签: unit-testing wif

我通过创建一个继承HttpContextBase并注入我的控制器的对象来测试asp.net mvc代码。

myfooController.ControllerContext.HttpContext = new FakeHttpContext();

通过这样做,我可以模拟各种各样的asp.net特性:url,referrer,用户代理,cookie等。它很棒。

我正在编写单元测试来覆盖我们的FederatedIdentity控制器,该控制器解码RelyingPArty签名请求并适当地处理它们。我的FakeHttpContext允许我测试各种各样的场景:null signIn请求,坏共享机密等。

在我们当前的WIF项目中,我们需要调用静态类FederatedAuthentication.SessionAuthenticationModule.CookieHandler来做一些cookie。

当我从单元测试中执行此操作时,它会爆炸,因为HttpContext.Current为null。 SessionAuthenticationModule似乎使用HttpContext.Current,无法将其设置为我的伪上下文。由于HttpContext.Current不从HttpContextBase继承,因此我无法设置任何相关属性来执行有用的测试。

我的结论是,在2011年,微软的某个人创建了非常重要的身份验证代码,这些代码完全完全不能通过单元测试吗?真的?

2 个答案:

答案 0 :(得分:0)

您如何处理实际身份验证?

您是否拥有有效的会话和声明身份验证对象?

SelfSTS对于您描述的单元测试场景非常有用。

答案 1 :(得分:0)

请看看Scott Hanselman撰写的article。他将HttpContext和其他ASP.NET工件的模拟用于其他目的(例如FileUploads),但我使用相同的技术:

本质:

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; 

....

我可能不会对WIF进行单元测试。