【问题标题】:How do I unit test a controller method that has the [Authorize] attribute applied?如何对应用了 [Authorize] 属性的控制器方法进行单元测试?
【发布时间】:2010-12-25 00:50:55
【问题描述】:

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

如果您为过滤后的[Authorize] ActionResult 编写单元测试,您如何解决伪造该用户已通过身份验证的问题?

我有很多用[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.

【问题讨论】:

  • 有些东西你没有给我们看。您显示的测试不会执行 any 操作过滤器。也许您有可以使用的代码,但这不在您的问题之内。对于初学者来说,错误的整个调用堆栈怎么样?

标签: asp.net-mvc unit-testing authorization


【解决方案1】:

您需要为您的控制器模拟一个上下文。尝试使用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 站点。

【讨论】:

  • 我可能会争辩说你根本不需要真正测试这个。编写 ASP.NET MVC 的团队已经对该属性进行了很好的测试。您可以下载源代码并自己查看。
  • 不是测试[Authorized]属性,而是绕过它测试ActionResult方法
  • @Jeff Putz 你难道不想测试一下有人在重构期间没有删除该属性吗?
  • 我不确定这个测试是做什么的?好像什么都不做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多