簡體   English   中英

有什么方法可以在我的 ASP.NET MVC web 應用程序中模擬聲明主體?

[英]Is there any way I can mock a Claims Principal in my ASP.NET MVC web application?

我有一些ASP.NET MVC controller 代碼檢查用戶是否經過身份驗證,如果是,它會檢查它是否有特定的聲明。 工作正常。

我有一些單元測試,我需要模擬一個IPrincipal (這很容易做到)......但我不知道如何檢查索賠! 我通常會做類似的事情

public static ClaimsPrincipal ClaimsPrincipal(this Controller controller)
{
    return controller.User as ClaimsPrincipal;
}

和一些 controller 代碼......

this.ClaimsPrincipal().HasClaim(x => x.......);

但是當我在單元測試中對此進行測試時,這一切都失敗了。因為我不確定如何mock ClaimsPrincipal

有任何想法嗎?

模擬ClaimsPrincipal並不困難

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

但是,將取決於您的控制器如何訪問它。 看看這個問題如何使用moq模擬Controller.User

這會給你這樣的東西:

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

var sut = new UtilityController();

var contextMock = new Mock<HttpContextBase>();
contextMock.Setup(ctx => ctx.User).Returns(cp.Object);

var controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(con => con.HttpContext).Returns(contextMock.Object);

sut.ControllerContext = controllerContextMock.Object;

var viewresult = sut.Index();

我不確定您對“模擬”的含義。 但是您可以簡單地從頭開始創建ClaimsPrincipal。 首先創建ClaimsIdentity-添加所需的聲明和身份驗證方法。 然后用ClaimsPrincipal包裝它。

而且大多數方法都是虛擬的,因此它們是可模擬的。

您可以聲明並傳遞一個真正的 object,如下例所示:

var controller = new ExampleController();
var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] {
                                        new Claim(JwtClaimIdentifiers.Rol, "viewer"),
                                   }, "Test"));
            controller.ControllerContext = new ControllerContext();
            controller.ControllerContext.HttpContext = new DefaultHttpContext { User = user };

暫無
暫無

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

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