有什么办法我可以模拟索赔本金在我的ASP.NET MVC web应用程序



我有一些ASP.NET MVC控制器代码,检查用户是否经过身份验证,如果是,它检查是否有特定的声明。没问题。

我有一些单元测试,我需要模拟出一个IPrincipal(这很容易做到)…但我不知道如何检查索赔!我通常会这样做

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

和一些控制器代码…

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

但是当我在单元测试中测试时,这一切都失败了。因为我不知道怎么才能把mock变成ClaimsPrincipal

任何想法?

嘲弄claimprincipal并不太难

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

然而,这取决于你的控制器如何获得访问它。看看这个问题如何模拟控制器。用户使用moq

它会给你像这样的东西:

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();

我不知道你说的"mock"是什么意思。但是您可以简单地从头创建claimprincipal。首先创建ClaimsIdentity—添加所需的声明和身份验证方法。然后用claimprincipal封装。

大多数方法都是虚拟的,所以它们是可模拟的。

你可以声明并传递一个真实的对象,如下所示:

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

相关内容

  • 没有找到相关文章

最新更新