代码之家  ›  专栏  ›  技术社区  ›  Carles Company

测试使用user.identity.name的控制器操作

  •  34
  • Carles Company  · 技术社区  · 15 年前

    我有一个操作依赖于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提供模拟。如果我按照自己的方式运行测试(不模拟用户…),我会得到一个空值。例外。

    哪种方法是正确的?我认为我的操作代码不适合单元测试。

    2 回复  |  直到 8 年前
        1
  •  21
  •   Tomas Aschan    8 年前

    更好的方法是通过 string 论点 userName (或 IPrincipal 论点 user 如果您需要更多的信息而不仅仅是名称)到actionMethod,那么可以使用actionFilterAttribute在普通请求中“注入”actionMethod。当你测试它时,你只需要提供你自己的模拟对象,因为动作过滤器的代码不会运行(在大多数情况下-如果你特别想…,有办法…)

    Kazi Manzur Rashid在 excellent blog post .

        2
  •  65
  •   bicycle    12 年前

    您可以使用此代码

    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 模拟框架,但是你可以使用你喜欢的任何东西。