Comment se moquer de HttpContext (ControllerContext) Moq cadre, et de session

Je veux tester mon application MVC, et je veux, à se moquer de HttpContext. Je suis en utilisant Moq cadre, et voici ce que j'ai fait, à se moquer de HttpContext:

[SetUp]
public void Setup()
{
    MyUser myUser = new MyUser();
    myUser.Id = 1;
    myUser.Name = "AutomatedUITestUser";

    var fakeHttpSessionState = 
                         new FakeHttpSessionState(new SessionStateItemCollection());
    fakeHttpSessionState.Add("__CurrentUser__", myUser);

    ControllerContext mockControllerContext = Mock.Of<ControllerContext>(ctx =>
        ctx.HttpContext.User.Identity.Name == myUser.Name &&
        ctx.HttpContext.User.Identity.IsAuthenticated == true &&
        ctx.HttpContext.Session == fakeHttpSessionState &&
        ctx.HttpContext.Request.AcceptTypes == 
                       new string[]{ "MyFormsAuthentication" } &&
        ctx.HttpContext.Request.IsAuthenticated == true &&
        ctx.HttpContext.Request.Url == new Uri("http://moqthis.com") &&
        ctx.HttpContext.Response.ContentType == "application/xml");

    _controller = new SomeController();
     _controller.ControllerContext = mockControllerContext; //this line is not working
    //when I see _controller.ControllerContext in watch, it get's me 
    //_controller.ControllerContext threw an exception of type System.ArgumentException
}

[Test]
public void Test_ControllerCanDoSomething()
{
    //testing an action of the controller
    //The problem is, here, System.Web.HttpContext.Current is null
}

Parce que mon application utilise Session pour contenir les données de l'utilisateur et l'authentification de l'info dans presque chaque méthode d'action, donc j'ai besoin de HttpContext et à l'intérieur j'ai besoin de Session et mettre __CurrentUser__ à l'intérieur de la session, de sorte que les méthodes d'action auraient accès à des faux de l'utilisateur connecté.

Cependant, HttpContext n'est pas défini et il est null. J'ai beaucoup cherché et je n'arrivais pas à trouver ma réponse.
Ce qui ne va pas?

Mise à jour:
J'ai aussi tester en dessous de la ligne, et obtenir le même résultat

_controller.ControllerContext = new ControllerContext(
                       mockControllerContext.HttpContext, new RouteData(), _controller);
double possible de Comment faire pour se moquer de l'HttpContext dans ASP.NET MVC à l'aide Moq?
Microsoft recommande l'utilisation de HttpContextWrapper dans votre code, de sorte que les tests unitaires sera plus facile plus tard.msdn.microsoft.com/en-us/library/...
merci @MikeCheel mais ma question est différente, je n'ai pas mis HttpContext au lieu de ControllerContext, mon problème est que je ne peut pas définir de ControllerContext ! quelqu'un peut-il répondre à mes qiestion ?
Vous pouvez créer un ControllerContext et passez dans un HttpContextBase dans son constructeur. Aussi, le HttpContext sur le ControllerContext est un HttpContextBAse et donc vous devriez être en mesure d'utiliser le HttpContextWrapper.
J'ai aussi tester en dessous de la ligne, et obtenir le même résultat _controller.ControllerContext = new ControllerContext(mockControllerContext.HttpContext, de nouvelles RouteData(), _controller);

OriginalL'auteur Omid Shariati | 2014-03-05