Hina Khuman
Hina Khuman

Reputation: 767

How to pass UserIdentity from test in unit testing

I'm trying to write test cases for my web api methods.

 [Fact]
 public async Task Get_Message_By_Id()
 {
    var messages = new Messages()
    {
        MessageId = 1,
        Recipient = "1;2;3",
        Subject = "Test Subject",
        MessageText = "test subject"
    };

    var mesBL = new Mock<IMessagesBusinessLogic>();
        mesBL
            .Setup(repo => repo.GetRecivedMessageById(It.IsAny<IWebToken>() ,messages.MessageId))
            .Returns(Task.FromResult(messages));

    var messageController = new MessagesController(mesBL.Object);

    var contentResult = await messageController.GetRecivedMessageById(messages.MessageId) as OkObjectResult; 

    Assert.NotNull(contentResult);
 }

I get an error of null reference while GetRecivedMessageById method call.

Controller method;

[HttpGet]
[Route("{id:int}")]
public async Task<IActionResult> GetRecivedMessageById(int id)
{
    return Ok(await _messagesBusinessLogic.GetRecivedMessageById(User.GetWebToken(), id));
}

Here, issue is because, user identity passing NULL.

How can we pass it from Test?

Upvotes: 1

Views: 761

Answers (1)

Nkosi
Nkosi

Reputation: 247323

User is null because it was not setup in the test before exercising the method under test.

//Create test user
var displayName = "User name";
var role = "SomeRole";

var token = new Mock<IWebToken>();
token.Setup(m => m.DisplayName).Returns(displayName);
token.Setup(m => m.Role).Returns(role);

var identity = new UserIdentity(token.Object);

var principal = new GenericPrincipal(identity, roles: new string[] { });
var user = new ClaimsPrincipal(principal);
// Set the User on the controller via the ControllerContext
var messageController = new MessagesController(mesBL.Object) {
    ControllerContext = new ControllerContext()
    {
        HttpContext = new DefaultHttpContext() { User = user }
    }
};

Upvotes: 1

Related Questions