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

时间:2009-12-09 22:02:54

标签: 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");
}

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

1 个答案:

答案 0 :(得分: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;

你应该能够做你的行为&amp;断言。

如果您还没有,我强烈建议您浏览NerdDinner作为MVC网站示例。