Is there any way I can mock a Claims Principal in my ASP.NET MVC web application?
Solution 1
Also most of the methods are virtual so those are mock-able.
Solution 2
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();
Solution 3
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.
Pure.Krome
Just another djork trying to ply his art in this mad mad world. Tech stack I prefer to use: Laguage: C# / .NET Core / ASP.NET Core Editors: Visual Studio / VS Code Persistence: RavenDB, SqlServer (MSSql or Postgres) Source control: Github Containers: Docker & trying to learn K&'s Cloud Platform: Azure Caching/CDN: Cloudflare Finally: A Tauntaun sleeping bag is what i've always wanted spaces > tabs
Updated on June 06, 2022Comments
-
Pure.Krome about 2 years
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 likepublic 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
theClaimsPrincipal
Any ideas?