Federated Identity:如何为测试目的注入httpContext



我正在通过创建一个继承HttpContextBase并注入到我的控制器中的对象来对asp.net mvc代码进行单元测试。

myfooController.ControllerContext.HttpContext = new FakeHttpContext();

通过这样做,我可以模拟各种各样的asp.net属性:url、referrer、用户代理、cookie等。它非常有效。

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

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

当我在单元测试中这样做时,它会爆炸,因为HttpContext.Current为null。SessionAuthenticationModule似乎使用HttpContext.Current,不能将其设置为我的伪上下文。由于HttpContext.Current不是从HttpContextBase继承的,所以我不能设置任何相关的属性来进行有用的测试。

我的结论是对的吗?2011年,微软有人创建了非常重要的身份验证代码,它完全不可单元测试?真正地

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

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

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

看看Scott Hanselman的这篇文章。他展示了出于另一个目的(例如FileUploads)对HttpContext和其他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; 
....

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

最新更新