c# - xunit - 如何在单元测试中获取 HttpContext.User.Identity
问题描述
我向我的控制器添加了一个方法来从HttpContext
. 在我的单元测试中HttpContext
是null,所以我得到一个异常。
我该如何解决这个问题?有没有办法起订量HttpContext
?
这是在我的基本控制器中获取用户的方法
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
....
}
推荐阅读
- javascript - 打字稿中的扩展与交集
- swift - BLE 和 ELM327 (CAN)
- docker-compose - docker-compose:depends_on 没有意义吗?没有单独的退出依赖,没有单独的重启依赖?
- selenium - 在 chrome 开发工具中,这些属性的组合是什么,为什么我不能快速复制它们
- javascript - 强制 Gatsby 中的导航功能仅在站点内重定向
- oracle - 安装 Oracle 数据库 11g 时检查 Oracle XE 服务实例失败我该怎么办
- angular - 如何在嵌套组件中使用 ng 内容
- python - 动画阻尼振荡器
- node.js - 在插入表之前检查重复项
- python - 为什么当我尝试在另一个文件中调用函数时解释器在 tkinter 中输出 namerror