用 [Authorize] 属性装饰的控制器的集成测试

Integration test on controller decorated with [Authorize] attribute

我的应用程序是 ASP.NET Core 1.0 Web API。

如何测试装饰有 Authorize 属性的控制器?

例如,使用此控制器和测试方法:

[TestMethod]
public void GetSomeDataTest()
{
   var controller = new MyController();
   Assert.AreEqual(controller.GetSomeData(), "Test");
}

[Authorize]
public ActionResult GetSomeData()
{
   return this.Content("Test");
}

这只是一个示例代码,可以让你们回答。我实际上是通过 TestServer 对象调用 Controller

这有 already been asked 但已接受的答案不再有效。 有什么建议可以“伪造”用户的真实性吗?

好吧,您实际上并没有调用控制器。相反,您是 运行 一个模拟测试,因此没有像 ASP.NET 引擎处理您的请求那样以传统方式发生任何事情——请求通过 HTTP 管道(因此授权模块)传递。

因此在测试时,您应该只关注控制器操作方法的内部逻辑而不是那个 Authorize 属性,因为在您的单元测试方法中,不会进行身份验证/授权。您将像任何其他方法一样设置模拟并调用控制器操作方法。

您可以为当前线程设置声明原则

[TestInitialize]
public void Initialize()
{
    var claims = new List<Claim>() 
    { 
        new Claim(ClaimTypes.Name, "UserName"),
        new Claim(ClaimTypes.Role, "Admin")
    };
    var identity = new ClaimsIdentity(claims, "TestAuth");
    var claimsPrincipal = new ClaimsPrincipal(identity);
    Thread.CurrentPrincipal = claimsPrincipal;
}

对于 .NET Core,您可以将用户设置为控制器上下文

private MyController _ctrl;

[TestInitialize]
public void Initialize()
{
    var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
    {
         new Claim(ClaimTypes.Name, "UserName"),
         new Claim(ClaimTypes.Role, "Admin")
    }));

    _ctrl = new MyController();
    _ctrl.ControllerContext = new ControllerContext()
    {
        HttpContext = new DefaultHttpContext() { User = user }
    };
}

[TestMethod]
public void GetSomeDataTest()
{
    Assert.AreEqual(_ctrl.GetSomeData(), "Test");
}