Search code examples
c#unit-testing.net-corexunit

xunit - how to get HttpContext.User.Identity in unit tests


I added a method to my controllers to get the user-id from the JWT token in the HttpContext. In my unit tests the HttpContext is null, so I get an exception.

How can I solve the problem? Is there a way to moq the HttpContext?

Here is the method to get the user in my base controller

protected string GetUserId()
{
    if (HttpContext.User.Identity is ClaimsIdentity identity)
    {
        IEnumerable<Claim> claims = identity.Claims;
        return claims.ToList()[0].Value;
    }

    return "";
}

One of my tests look like this

[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
    //....
}

Solution

  • There really is no need to have to mock the HttpContext in this particular case.

    Use the DefaultHttpContext and set the members necessary to exercise the test to completion

    For example

    [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
        ....
    }