我通过创建一个继承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年,微软的某个人创建了非常重要的身份验证代码,这些代码完全完全不能通过单元测试吗?真的?
答案 0 :(得分:0)
答案 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进行单元测试。