asp.net-mvc - 使用 User.Identity.Name的ASP.NET mvc测试控制器操作

  显示原文与译文双语对照的内容
64 3

我有一个依赖于 User.Identity.Name的操作来获取当前用户的用户名来获取他的命令列表:

public ActionResult XLineas()
 {
 ViewData["Filtre"] = _options.Filtre;
 ViewData["NomesPendents"] = _options.NomesPendents;
 return View(_repository.ObteLiniesPedido(User.Identity.Name,_options.Filtre,_options.NomesPendents));
 }

现在我正在试图为这个编写单元测试,但是我不知道如何为 User.Identity.Name 提供一个模拟。如果我像( 没有对用户的模拟。) 那样运行测试,我得到了一个空值。异常。

这是哪种正确的方法?我认为我的行动代码不适用于单元测试。

时间:原作者:0个回答

123 5

一种更好的方法是将 string 参数 userName ( 如果你需要的信息多于名称,则为 IPrincipal 参数 user ) 传递给 ActionMethod,使用ActionFilterAttribute在正常请求中进行"插入"。当你测试它时,你只提供自己的模拟对象,因为筛选器的操作代码不会运行( 如果你希望。

Kazi Manzur Rashid在第 7点详细描述了一个优秀博客文章 in 。

原作者:
66 2

你可以使用这里代码

public SomeController CreateControllerForUser(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;
}

它使用最小化的框架,但是肯定你可以使用任何你喜欢的东西。

原作者:
...