2

유닛 컨트롤러 로직을 테스트하려고합니다. (.Net 코어 2 mvc 앱) 사용자는 구체적인 주장을하고 있으며, 나는 XUnit을 사용하여 단위 테스트를하고 싶다. 여기 .net core mvc 신원 확인 및 클레임 테스트 및 사용자의 소유권 주장 여부 테스트

는 컨트롤러 :

public async Task<IActionResult> Details(int? id) 
{ 
    if (id == null) 
    { 
     return NotFound(); 
    } 

    var controlException = await _context.ControlException.FirstOrDefaultAsync(m => m.Id == id); 

    if (controlException == null) 
    { 
     return NotFound(); 
    } 
    if (User.HasClaim("control Claim", "control Claim")) 
    { 
      return View(controlException); 
    } 
    else 
    { 
     return RedirectToAction("AccessDenied", "Account"); 
    } 

} 

내 단위 테스트 코드는 다음과 같습니다 (GetContextWithData() 반환 InMemory 테스트 데이터베이스) 결과가 "ViewResult"RedirectToAction "이고 때문이

[Fact] 
public async Task VerifyDetailsViewType() 
{ 

    using (var context = GetContextWithData()) 
    using (var _controller = new ControlExceptionsController(context)) 
    {  
     var userStore = new Mock<IUserStore<ApplicationUser>>(); 

     var userManager = new UserManager<ApplicationUser>(
         userStore.Object, null, null, null, null, null, null, null, null); 

     var cp = new Mock<ClaimsPrincipal>(); 
     cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())) 
      .Returns(true); 
     cp.Setup(m => m.Identity).Returns(identityMock.Object); 

     _controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
     _controller.ControllerContext.HttpContext.Request.Headers["Referer"] = "http://www.test.nl"; 

     var result = await _controller.Details(888); 
     Assert.IsType<ViewResult>(result); 
    } 
} 

내 테스트가 실패 ".

사용자가 소유권을 주장하지 않았기 때문에 내가 알기 때문에 질문을 어떻게 사용자에게 할당 할 수 있습니까? 즉, Identity과 클레임을 조롱하고이를 어떻게 관리 할 수 ​​있습니까?

+0

테스트에서 컨트롤러 사용자는 어디에 할당합니까? 당신은 그것을 조롱하지만 당신이 그것을 사용자에게 할당하는 곳을 보지 못합니다. – Nkosi

+0

내가 thr 사용자에게 소유권을 할당 한 경우 : userManager.AddClaimAsync (user, 새 클레임 ("컨트롤 클레임", "컨트롤 클레임")) 대기; 이 오류가 발생합니다. NotSupportedException : 저장소가 IUserClaimStore 을 구현하지 않습니다. –

+0

아니요, 주체를 컨텍스트의 '사용자'에게 할당합니다. '_controller.ControllerContext.HttpContext.User = cp.Object;' – Nkosi

답변

0

코드를 원하는대로 완료 할 수있게하려면 주 서버를 컨트롤러에 할당해야합니다.

주체를 모의했지만 테스트에서 컨트롤러에 할당하지 마십시오.

_controller.ControllerContext.HttpContext.User = cp.Object; 
+0

고마워요 @ Nkosi입니다. –