testing控制器使用User.Identity.Name的操作

我有一个依赖于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)); } 

现在我正在尝试为此编写unit testing,但是我遇到了如何为User.Identity.Name提供一个Mock。 如果我运行我的testing(没有模拟用户…),我得到一个空..exception。

这是正确的方法? 我在想,我的行动代码是不好的unit testing。

这样做的一个更好的方法是将一个string参数userName (或者一个IPrincipal参数user ,如果你需要更多的信息,而不仅仅是名字)传递给ActionMethod,你使用ActionFilterAttribute在一个普通的请求中“注入”。 当你testing它时,你只需要提供你自己的模拟对象,因为动作filter的代码不会运行(在大多数情况下 – 如果你特别想要的话,有办法…)

Kazi Manzur Ra​​shid在一篇优秀的博客文章中详细介绍了这一点。

你可以使用这个代码

 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; } 

它使用Moq嘲笑框架,但确定你可以使用任何你喜欢的东西。