2017-04-15 1 views
3

내가 JWT는과 같이 클라이언트의 사용자 이름을 얻을 주장 이용한 제어 방법을 테스트하려고 해요 주장 :단위 테스트 .NET 핵심 웹 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 자기 교육 목적을 위해 왜이 질문이 * 정확히 * 연결된 것과 동일한 지 설명 할 수 있습니까? 유사점이 있지만, Ilya의 대답은 직접적이고 간단합니다. 나는 공훈으로 보았습니다. –

답변

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