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

时间:2017-04-03 12:51:36

标签: c# asp.net asp.net-core integration-testing bearer-token

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

正如标题所说:我如何测试用Authorize属性修饰的控制器?

例如,使用此控制器和testmethod:

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

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

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

这已被already提出,但已接受的答案已不再适用。 任何建议我如何"假"用户的真实性?

谢谢

2 个答案:

答案 0 :(得分:4)

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

[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");
}

答案 1 :(得分:-2)

嗯,你实际上并没有调用控制器,而是你正在运行一个模拟测试,因此没有任何事情像传统方式那样发生,比如处理你的请求的ASP.NET引擎 - &gt;请求通过HTTP管道传递(因此授权模块)。

因此,在测试时,您应该只关注控制器操作方法的内部逻辑,而不是单元测试方法中的Authorize属性原因,不会发生认证/授权。您将设置模拟并以任何其他方法调用控制器操作方法。