I have an action that relies on User.Identity.Name to get the username of the current user to get a list of his orders:
public ActionResult XLineas()
{
A better way of doing this would be to pass a string
argument userName
(or an IPrincipal
argument user
, if you need more information than just the name) to the ActionMethod, which you "inject" in a normal request using an ActionFilterAttribute. When you test it, you just supply your own mock object, as the action filter's code will not run (in most cases - there are ways to, if you specifically want to...)
Kazi Manzur Rashid describes this in detail under point 7 in an excellent blog post.
You can use this code
public SomeController CreateControllerForUser(string userName)
{
var mock = new Mock<ControllerContext>();
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
var controller = new SomeController();
controller.ControllerContext = mock.Object;
return controller;
}
It uses Moq mocking framework, but sure you can use anything you like.