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

Kev*_*ang 5 tdd asp.net-mvc

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

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

Sly*_*Sly 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;
}
Run Code Online (Sandbox Code Playgroud)

它使用moq lib


Zac*_*tes 4

您问题的最后一行可能是最快的解决方案,但是,我认为您不需要创建接口,它HttpContext.Current.User已经是一个IPrincipal并且HttpContext.Current.User.Identity已经是一个IIdentity.

如果您的检查逻辑使用这些接口中的任何一个,则可以模拟控制器来传递您创建的 IIdentity 而不是 HttpContext.Current.User.Identity

希望有帮助!