12

我有一些ASP.NET MVC控制器代码可以检查用户是否经过身份验证,如果是,它会检查它是否有特定的声明。工作正常。

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

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

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

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

但是当我在我的单元测试中测试这个时这一切都失败了..因为我不确定我怎么mockClaimsPrincipal

有任何想法吗?

4

3 回答 3

13

模拟 ClaimsPrincipal 并不太难

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

但是,这取决于您的控制器如何访问它。看看这个问题How to mock Controller.User using 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();
于 2014-04-12T02:14:24.373 回答
6

我不确定您所说的“模拟”是什么意思。但是您可以简单地从头开始创建 ClaimsPrincipal。首先创建一个 ClaimsIdentity - 添加您需要的声明和身份验证方法。然后用 ClaimsPrincipal 包装它。

于 2013-01-07T06:04:51.597 回答
3

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

于 2013-01-09T02:20:48.550 回答