2016-12-30 40 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 referenceGetRecivedMessageById方法调用的错误。

控制器方法;

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

在这里,问题是因为,用户身份传递NULL。

我们如何通过测试?

+1

[嘲讽的IPrincipal在ASP.NET核心]的可能的复制(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

相关问题