我正在尝试对我的ASP.NET MVC应用程序中的页面进行单元测试,当发布到该页面时,将删除用户的项目。我想限制此页面,以便它只能由所述项目的所有者发布。最初,我想在控制器中快速检查,检查HttpContext.Current.User.Identity.Name是否等于项目的所有者,但我很快意识到单元测试这将是困难的。
我应该创建一个提供访问当前登录用户名称的方法的界面吗?
答案 0 :(得分:5)
您可以使用此代码
Controller CreateControllerAs(string userName) {
var mock = new Mock<ControllerContext>();
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
var controller = new SomeController();
controller.ControllerContext = mock.Object;
return controller;
}
它使用moq lib
答案 1 :(得分:4)
您问题的最后一行可能是最快的解决方案,但是,我认为您不需要创建界面,HttpContext.Current.User
已经是IPrincipal
而且HttpContext.Current.User.Identity
已经是IIdentity
。
如果您的检查逻辑使用其中任何一个接口,则可以模拟控制器以传递您创建的IIdentity而不是HttpContext.Current.User.Identity
希望有所帮助!
答案 2 :(得分:2)
我使用Thread.CurrentPrincipal.Identity.Name。为单元测试创建GenericPrincipal并附加它是微不足道的。