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

Web*_*ing 30 asp.net-mvc unit-testing authorization

我搜索了stackoverflow并用Google搜索了几个小时,但仍未找到解决我"琐碎"问题的任何解决方案.

如果您为过滤器编写单元测试[Authorize] ActionResult,那么如何解决问题以假冒该用户的身份验证?

我有很多ActionResult过滤的方法,[Authorize]我想测试我的所有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");
}
Run Code Online (Sandbox Code Playgroud)

截至目前,由于[Authorize]过滤器,测试甚至没有命中ActionResult方法,抛出的异常是: System.NullReferenceException: Object reference not set to an instance of an object.

Nat*_*ate 27

您需要模拟控制器的上下文.尝试使用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;
Run Code Online (Sandbox Code Playgroud)

你应该能够做你的行为和断言.

如果您还没有,我强烈建议您通过NerdDinner查看MVC网站示例.

  • 它不是测试`[Authorized]`属性,而是绕过它来测试`ActionResult`方法 (8认同)
  • 这似乎不适用于最新版本. (8认同)
  • @Jeff Putz 难道您不也想测试有人在重构期间没有删除该属性吗? (2认同)