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);
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
Vous devez vous connecter pour publier un commentaire.
À en juger par cette réponse: Se Moquant De L'Asp.net mvc Contexte de Contrôleur
Il semble que vous besoin pour se moquer de la Demande elle-même, ainsi que les propriétés de l'objet request.
par exemple
etc (le code complet est dans la réponse).
Salut @Dave vous êtes mieux de poser une question distincte si vous ne l'avez pas déjà.
OriginalL'auteur Alex KeySmith