ASP.NET Core控制器测试中为HttpContext添加myid声明的方法
解决测试中为HttpContext.User添加自定义Claim的问题
问题原因
GenericPrincipal的Claims属性是只读的,无法直接赋值,必须在实例化时就传入包含目标Claim的身份对象。
解决方案1:使用ClaimsIdentity创建用户身份
创建ClaimsIdentity时直接加入myid Claim,再用它实例化GenericPrincipal:
MyProperty myProperty = new() { MyLim = 1, MyName = "Controller Test" }; // Mock RetrieveAllItems,控制器中需要通过该方法获取allItems var mockAllItems = new List<YourItemType> // 替换为实际的实体类型 { new YourItemType { myId = id, // 与生成的Guid一致 foreignkeyIdColumn = 1 // 需与GetDetailsById的入参匹配 } }; _myRepository.Setup(_ => _.RetrieveAllItems()).Returns(mockAllItems); // Mock GetDetailsById方法 referenceDataRepository.Setup(_ => _.GetDetailsById(It.IsAny<int>())).Returns(myProperty); Guid id = Guid.NewGuid(); // 创建包含myid声明的ClaimsIdentity var claimsIdentity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "MyTestID"), // 保留原Name声明 new Claim("myid", id.ToString()) }, "TestAuthType"); // 赋值给HttpContext.User sut.ControllerContext.HttpContext = new DefaultHttpContext { User = new GenericPrincipal(claimsIdentity, new[] { "Role" }) };
解决方案2:直接使用ClaimsPrincipal(推荐)
ASP.NET Core中更推荐使用ClaimsPrincipal,可直接构造包含所有声明的用户对象:
MyProperty myProperty = new() { MyLim = 1, MyName = "Controller Test" }; // Mock RetrieveAllItems var mockAllItems = new List<YourItemType> { new YourItemType { myId = id, foreignkeyIdColumn = 1 } }; _myRepository.Setup(_ => _.RetrieveAllItems()).Returns(mockAllItems); referenceDataRepository.Setup(_ => _.GetDetailsById(It.IsAny<int>())).Returns(myProperty); Guid id = Guid.NewGuid(); // 构造包含所有声明的ClaimsPrincipal var claims = new List<Claim> { new Claim(ClaimTypes.Name, "MyTestID"), new Claim("myid", id.ToString()), new Claim(ClaimTypes.Role, "Role") // 角色也可作为声明添加 }; sut.ControllerContext.HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(claims)) };
额外注意事项
- 必须mock
_myRepository.RetrieveAllItems()方法,否则控制器中allItems会为null,调用FirstOrDefault时会抛出空引用异常。 - 确保
mockAllItems中的myId与生成的id一致,foreignkeyIdColumn的值要和GetDetailsById的入参匹配,保证mock返回值正确。
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

