Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit Testing .NET Core Web API Controllers with JWT Claims [duplicate]

I'm attempting to test a controller method that utilizes JWT claims to get the user name of the client like so:

[Authorize]
[Route("api/[controller]")]
public class ApprovalsController : Controller
{
  // POST api/approvals
    [HttpPost]
    public IActionResult Post([FromBody]ApprovalViewModel value)
    {
        // ...

        // Incoming approval VM converted here
        Approval newApproval = TinyMapper.Map<Approval>(value);

        // Values set server-side here.
        newApproval.Id = -1;
        newApproval.Created = DateTime.Now;

        // Claim queried here
        newApproval.CreatedBy = User.FindFirst(ClaimTypes.Name).Value; 

        // Submission to context
        _approvalRepo.Insert(newApproval);
        _approvalRepo.Update();

        // ...
    }

But I've had the darnedest luck in trying to conceive of a way to unit test the above controller using Moq and XUnit. Many of the questions I've searched for involve directly setting the ControllerBase.User attribute of the controller, but in Aspnetcore.MVC (1.1.1), User has been set as read-only.

What is it that I'm to do, here?

like image 993
D Owrey Avatar asked Apr 15 '17 18:04

D Owrey


1 Answers

Controller.User is just a wrapper of Controller.ControllerContext.HttpContext.User. Mock any context first:

var controller = new HomeController();

var contextMock = new Mock<HttpContext>();
contextMock.Setup(x => x.User).Returns(new ClaimsPrincipal());

controller.ControllerContext.HttpContext = contextMock.Object;

Assert.NotNull(controller.User);
like image 200
Ilya Chumakov Avatar answered Sep 21 '22 18:09

Ilya Chumakov