【问题标题】:Handle Claims while testing controller in asp.net core在 asp.net core 中测试控制器时处理声明
【发布时间】:2020-05-22 01:56:21
【问题描述】:

在 asp.net core 中工作,有几个控制器有声明。示例代码是这样的。

[HttpGet, Route("GetCustomerList")]
        public ActionResult<GenericResponse> Get()
        {
            var claims = User as ClaimsPrincipal;
            string username = claims.Claims.Where(c => c.Type == "UserName").Select(x => x.Value).FirstOrDefault();
            string roleid = claims.Claims.Where(c => c.Type == "RoleId").Select(x => x.Value).FirstOrDefault();
            ........
            ........
        }

在控制器测试时我应该如何处理这种声明?我已经尝试了给定How to add claims in a mock ClaimsPrincipal 的解决方案,即第一个解决方案。但是,在我的控制器中,调试时给 User 一个 null 并且它停止了。

【问题讨论】:

    标签: c# unit-testing asp.net-core nunit


    【解决方案1】:

    您尝试在控制器中访问的用户位于 HttpContext 上,因此您可以为被测控制器创建 DefaultHttpContext 并将 ClaimsPrincipal 链接到此 DefaultHttpContext,如下例所示:

    var fakeClaims = new List<Claim>()
    {
       new Claim(ClaimTypes.Name, "name"),
       new Claim("RoleId", "1"),
       new Claim("UserName", "John")
    };
    
    var fakeIdentity = new ClaimsIdentity(fakeClaims, "TestAuthType");
    var fakeClaimsPrincipal = new ClaimsPrincipal(fakeIdentity);
    
    ControllerToTest controller = new ControllerToTest();
    
    ControllerToTest.ControllerContext.HttpContext = new DefaultHttpContext
    {
       User = fakeClaimsPrincipal 
    };
    
    ControllerToTest.Get();
    

    您还可以按照this example 模拟 HttpContext

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多