2017-04-15 93 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);