2017-04-15 51 views
3

我試圖測試利用智威湯遜聲稱獲取的用戶名的客戶端的像這樣的控制方法:智威湯遜單元測試.NET的核心Web API控制器索賠

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

     // ... 
    } 

但我已經在嘗試設想使用Moq和XUnit對上述控制器進行單元測試的方法方面最爲幸運。我搜索的許多問題都涉及直接設置控制器的ControllerBase.User屬性,但在Aspnetcore.MVC(1.1.1)中,用戶已被設置爲只讀

我要做什麼,在這裏?

+0

@Nkosi爲了自我教育的目的,你能解釋爲什麼這個問題與*鏈接完全相同嗎?有相似之處,但伊利亞的答案是直接和簡單的,我認爲這是有價值的。 –

回答

1

Controller.User只是Controller.ControllerContext.HttpContext.User的包裝。首先嘲笑任何情境:

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