c# - xunit-如何在单元测试中获取HttpContext.User.Identity

标签 c# unit-testing .net-core xunit

我向 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/

相关文章:

unit-testing - Microsoft Visual Studio 测试导致测试失败

c# - 我可以使用 RandomNumberGenerator.GetInt32() 方法生成密码安全的随机字符串吗?

c# - 没有代码隐藏的 ASP.net 页面

c# - 一个变量,多个值?

c# - 有什么可以与#pragma message 相提并论的吗?

c# - 通过将抽象类实例化为模拟对象来对其进行单元测试是否可以?

安卓命令行测试

c# - 无法翻译 LINQ 表达式,将对其求值

c# - 使用 asp.net core 3.0 时传递有效 token 时,Postman 返回 401 unothorized

c# - try catch block 中的对象