有什么办法可以在我的ASP.NET MVC Web应用程序中模拟一个Claims Principal吗?

Pur*_*ome 11 .net asp.net-mvc claims-based-identity claims asp.net-identity

我有一些ASP.NET MVC控制器代码,用于检查用户是否经过身份验证,如果是,则会检查是否有特定声明.工作良好.

我有一些单元测试,我需要模拟一个IPrincipal(这很容易做到)......但我不确定如何检查索赔!我经常这样做

public static ClaimsPrincipal ClaimsPrincipal(this Controller controller)
{
    return controller.User as ClaimsPrincipal;
}
Run Code Online (Sandbox Code Playgroud)

和一些控制器代码......

this.ClaimsPrincipal().HasClaim(x => x.......);
Run Code Online (Sandbox Code Playgroud)

但是当我在我的单元测试中测试时,这一切都失败了.因为我不知道我怎么能mock这样做ClaimsPrincipal

有任何想法吗?

Boz*_*Joe 12

嘲笑ClaimsPrincipal并不困难

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

但是,取决于您的控制器如何获得访问权限.看看这个问题如何使用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();
Run Code Online (Sandbox Code Playgroud)


lea*_*ege 6

我不确定你对"模拟"的意思.但您可以从头开始创建一个ClaimsPrincipal.首先创建一个ClaimsIdentity - 添加您需要的声明和身份验证方法.然后用ClaimsPrincipal包装它.


Bro*_*len 3

而且大多数方法都是虚拟的,因此它们是可模拟的。