2016-12-30 74 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