我向 Controller 添加了一个方法,以从HttpContext
中的JWT token 获取用户ID。在我的单元测试中,HttpContext
为null,因此出现异常。
我该如何解决这个问题?有没有一种方法可以将HttpContext
最小化?
这是使用户进入我的基本 Controller 的方法
protected string GetUserId()
{
if (HttpContext.User.Identity is ClaimsIdentity identity)
{
IEnumerable<Claim> claims = identity.Claims;
return claims.ToList()[0].Value;
}
return "";
}
我的一项测试如下所示
[Theory]
[MemberData(nameof(TestCreateUsergroupItemData))]
public async Task TestPostUsergroupItem(Usergroup usergroup)
{
// Arrange
UsergroupController controller = new UsergroupController(context, mapper);
// Act
var controllerResult = await controller.Post(usergroup).ConfigureAwait(false);
// Assert
//....
}
最佳答案
在这种特殊情况下,确实不需要模拟HttpContext
。
使用DefaultHttpContext
并将完成测试所需的成员设置为完成
例如
[Theory]
[MemberData(nameof(TestCreateUsergroupItemData))]
public async Task TestPostUsergroupItem(Usergroup usergroup) {
// Arrange
//...
var identity = new GenericIdentity("some name", "test");
var contextUser = new ClaimsPrincipal(identity); //add claims as needed
//...then set user and other required properties on the httpContext as needed
var httpContext = new DefaultHttpContext() {
User = contextUser;
};
//Controller needs a controller context to access HttpContext
var controllerContext = new ControllerContext() {
HttpContext = httpContext,
};
//assign context to controller
UsergroupController controller = new UsergroupController(context, mapper) {
ControllerContext = controllerContext,
};
// Act
var controllerResult = await controller.Post(usergroup).ConfigureAwait(false);
// Assert
....
}
关于c# - xunit-如何在单元测试中获取HttpContext.User.Identity,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58950672/