簡體   English   中英

.net核心mvc模擬身份和聲明,並測試用戶是否有聲明

[英].net core mvc Mocking Identity and claims and test if user has claim

我正在嘗試對控制器邏輯進行單元測試,這是一個(.Net core 2 mvc App),如果用戶有特定聲明,我有一個控制器會返回項目的詳細信息,並且我想使用XUnit進行單元測試。

這是控制器:

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測試數據庫)

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

我的測試失敗,因為結果是“ RedirectToAction ”而不是“ ViewResult ”。

我知道,因為用戶沒有聲明,所以問題是如何向用戶分配聲明,換句話說,我如何模擬Identity和聲明並進行管理。

您需要將主體分配給控制器,以允許代碼按需執行。

您模擬了主體,但沒有將其分配給測試中的控制器。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM