你如何在ASP.NET MVC中存根User.Identity.Name?

时间:2008-11-17 18:27:39

标签: asp.net-mvc tdd

我正在尝试对我的ASP.NET MVC应用程序中的页面进行单元测试,当发布到该页面时,将删除用户的项目。我想限制此页面,以便它只能由所述项目的所有者发布。最初,我想在控制器中快速检查,检查HttpContext.Current.User.Identity.Name是否等于项目的所有者,但我很快意识到单元测试这将是困难的。

我应该创建一个提供访问当前登录用户名称的方法的界面吗?

3 个答案:

答案 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并附加它是微不足道的。