私はユニットロジックをテストしようとしています。(.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
とクレームを偽り、これをどう管理すればいいですか?
ここで、コントローラのユーザをテストに割り当てますか。あなたはそれを嘲笑しますが、私はどこにあなたがそれをユーザに割り当てているかわかりません。 – Nkosi
私はthrユーザーにクレームを割り当てます: await userManager.AddClaimAsync(user、新しいクレーム(「コントロールクレーム」、「コントロールクレーム」)); このエラーが発生します:NotSupportedException:ストアはIUserClaimStoreを実装していません。 –
いいえ、プリンシパルをコンテキストの 'User'に割り当てます。 '_controller.ControllerContext.HttpContext.User = cp.Object;' – Nkosi