2016-12-30 9 views
1

Я пытаюсь написать тестовые примеры для своих методов web api.Как пройти UserIdentity из теста при модульном тестировании

[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); 
} 

Я получаю ошибку null reference в то время как GetRecivedMessageById вызова метода.

Метод контроллера;

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

Здесь проблема возникает, потому что идентификация пользователя проходит NULL.

Как мы можем передать его из теста?

+1

Возможный дубликат [Mocking IPrincipal в ASP.NET Core] (http://stackoverflow.com/questions/38557942/mocking-iprincipal-in-asp-net-core) – Nkosi

ответ

1

Usernull потому что он не был установлен в тесте перед тем, как испытать тестируемый метод.

//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 } 
    } 
}; 
+0

Хорошо это для веб-API 2 как помечено в сообщении Вам может потребоваться удалить этот тег. Пользователь Core доступен только для чтения. проверяя, как установить это сейчас. скорее всего, это через HttpContext. – Nkosi

+0

Хорошо, обновленный ответ не дает никакой ошибки, позвольте мне проверить его. –

+0

только что заметил, что вы применяете метод 'UserIdentity' в методе расширения. вам нужно будет изменить настройку теста для соответствия этому ожиданию. Простое изменение примера «GenericIdentity». – Nkosi