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

} 

私のユニットテストコードは次のとおりです。結果は "RedirectToAction" ではなく "ViewResultあるので(GetContextWithData()戻りインメモリ・テスト・データベース)

[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ユーザーにクレームを割り当てます: await userManager.AddClaimAsync(user、新しいクレーム(「コントロールクレーム」、「コントロールクレーム」)); このエラーが発生します:NotSupportedException:ストアはIUserClaimStore を実装していません。 –

+0

いいえ、プリンシパルをコンテキストの 'User'に割り当てます。 '_controller.ControllerContext.HttpContext.User = cp.Object;' – Nkosi

答えて

0

必要に応じてコードを完了させるために、プリンシパルをコントローラに割り当てる必要があります。

プリンシパルをモックしますが、テストでコントローラに割り当てません。

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

ありがとう@Nkosiそれです。 –

関連する問題