문제

I've got some ASP.NET MVC controller code that checks if a user is authenticated and if so, it checks to see if it has a specific claim. Works fine.

I've got some unit tests and I need to mock out an IPrincipal (which is easy to do) ... but I'm not sure how to check for the claims! I usually do something like

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

and some controller code ...

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

but this all fails when I test this in my Unit Test .. because I'm not sure how I can mock the ClaimsPrincipal

Any ideas?

도움이 되었습니까?

해결책 3

Also most of the methods are virtual so those are mock-able.

다른 팁

Mocking the ClaimsPrincipal isnt too difficult

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

However depending on how your controller gains access to it will. Have a look at this Question How to mock Controller.User using moq

which would give you something like this:

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

I am not sure what you mean with "mock". But you can simply create a ClaimsPrincipal from scratch. First create a ClaimsIdentity - add the claims and authentication method you need. Then wrap it with a ClaimsPrincipal.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top