代码之家  ›  专栏  ›  技术社区  ›  Webking

如何对应用了[authorize]属性的控制器方法进行单元测试?

  •  27
  • Webking  · 技术社区  · 16 年前

    我搜索了StackOverflow并在Google上搜索了四个小时,仍然没有找到任何解决我的“琐碎”问题的方法。

    如果你为你的过滤写单元测试 [Authorize] ActionResult ,如何解决假冒该用户已通过身份验证的问题?

    我有很多 ActionResult 筛选的方法 [Authorize] 我想测试我所有的 行动结果 方法,不管它们是否被筛选 [授权] 或者没有。

    一个简单的例子:

    [TestMethod]
    public void Create_Get_ReturnsView()
    {
     // Arrange
     var controller = new UserController();
     // Act
     var result = controller.Create();
     // Assert
     Assert.IsNotNull(result as ViewResult);
    }
    
    [Authorize]
    public ActionResult Create()
    {
     return View("Create");
    }
    

    到目前为止,测试甚至没有因为[authorize]过滤器而命中actionResult方法,引发的异常是: System.NullReferenceException: Object reference not set to an instance of an object.

    1 回复  |  直到 16 年前
        1
  •  26
  •   Nate    16 年前

    您需要模拟控制器的上下文。试用使用 Moq

    您的安排如下:

    var controller = new UserController();
    var mock = new Mock<ControllerContext>();
    mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER");
    mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true);
    controller.ControllerContext = mock.Object;
    

    然后您应该能够执行您的行为和断言。

    如果你还没有,我强烈建议你去看看 NerdDinner 以MVC站点为例。