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 Rashid在一篇优秀的博客文章中详细介绍了这一点。
你可以使用这个代码
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嘲笑框架,但确定你可以使用任何你喜欢的东西。