J'ai un service Web que j'essaye de tester unitaire. Dans le service, il tire plusieurs valeurs de ce qui HttpContext
suit:
m_password = (string)HttpContext.Current.Session["CustomerId"];
m_userID = (string)HttpContext.Current.Session["CustomerUrl"];
dans le test unitaire, je crée le contexte à l'aide d'une simple demande de travail, comme ceci:
SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter());
HttpContext context = new HttpContext(request);
HttpContext.Current = context;
Cependant, chaque fois que j'essaie de définir les valeurs de HttpContext.Current.Session
HttpContext.Current.Session["CustomerId"] = "customer1";
HttpContext.Current.Session["CustomerUrl"] = "customer1Url";
J'obtiens une exception de référence nulle qui dit HttpContext.Current.Session
est nulle.
Existe-t-il un moyen d'initialiser la session en cours dans le test unitaire?
Réponses:
Nous avons dû nous moquer
HttpContext
en utilisant unHttpContextManager
et en appelant l'usine depuis notre application ainsi que les tests unitairesVous remplaceriez alors tous les appels à
HttpContext.Current
parHttpContextManager.Current
et aurez accès aux mêmes méthodes. Ensuite, lorsque vous testez, vous pouvez également accéder auHttpContextManager
et simuler vos attentesVoici un exemple utilisant Moq :
puis pour l'utiliser dans vos tests unitaires, j'appelle cela dans ma méthode Test Init
vous pouvez ensuite, dans la méthode ci-dessus, ajouter les résultats attendus de Session que vous vous attendez à être disponibles pour votre service Web.
la source
HttpContextManager
serait un meilleur nom queHttpContextSource
mais je suis d'accordHttpContextFactory
est trompeur.Vous pouvez le "simuler" en créant un nouveau
HttpContext
comme celui-ci:http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx
J'ai pris ce code et l'ai mis sur une classe d'assistance statique comme ceci:
Ou au lieu d'utiliser la réflexion pour construire la nouvelle
HttpSessionState
instance, vous pouvez simplement attacher votreHttpSessionStateContainer
auHttpContext
(selon le commentaire de Brent M. Spell):et ensuite vous pouvez l'appeler dans vos tests unitaires comme:
la source
Server.MapPath()
ne fonctionnera pas si vous l'utilisez non plus.La solution Milox est meilleure que celle acceptée à mon humble avis mais j'ai eu quelques problèmes avec cette implémentation lors de la gestion des URL avec querystring .
J'ai apporté quelques modifications pour que cela fonctionne correctement avec toutes les URL et pour éviter la réflexion.
la source
httpContext.Session
, une idée de comment faire la même chosehttpContext.Application
?J'ai quelque chose à ce sujet il y a quelque temps.
Test unitaire HttpContext.Current.Session dans MVC3 .NET
J'espère que ça aide.
la source
Si vous utilisez le framework MVC, cela devrait fonctionner. J'ai utilisé FakeHttpContext de Milox et ajouté quelques lignes de code supplémentaires. L'idée est venue de ce post:
http://codepaste.net/p269t8
Cela semble fonctionner dans MVC 5. Je n'ai pas essayé cela dans les versions antérieures de MVC.
la source
Vous pouvez essayer FakeHttpContext :
la source
Dans asp.net Core / MVC 6 rc2, vous pouvez définir le
HttpContext
rc 1 était
https://stackoverflow.com/a/34022964/516748
Pensez à utiliser
Moq
la source
La réponse qui a fonctionné avec moi est ce que @Anthony avait écrit, mais vous devez ajouter une autre ligne qui est
donc vous pouvez utiliser ceci:
la source
Essaye ça:
Et ajoutez la classe:
Cela vous permettra de tester à la fois avec la session et le cache.
la source
Je cherchais quelque chose d'un peu moins invasif que les options mentionnées ci-dessus. En fin de compte, j'ai trouvé une solution de fromage, mais cela pourrait faire bouger certains un peu plus vite.
J'ai d'abord créé une classe TestSession :
Ensuite, j'ai ajouté un paramètre facultatif au constructeur de mon contrôleur. Si le paramètre est présent, utilisez-le pour la manipulation de session. Sinon, utilisez HttpContext.Session:
Maintenant, je peux injecter mon TestSession dans le contrôleur:
la source
Ne vous moquez jamais ... jamais! La solution est assez simple. Pourquoi simuler une si belle création comme
HttpContext
?Poussez la session vers le bas! (Juste cette ligne suffit à la plupart d'entre nous pour comprendre mais expliqué en détail ci-dessous)
(string)HttpContext.Current.Session["CustomerId"];
c'est ainsi que nous y accédons maintenant. Remplacez ceci parLorsqu'il est appelé à partir d'un test, _customObject utilise un magasin alternatif (valeur de clé de base de données ou de cloud [ http://www.kvstore.io/] )
Mais lorsqu'il est appelé depuis l'application réelle,
_customObject
utiliseSession
.comment est-ce fait? eh bien ... Injection de dépendance!
Ainsi, le test peut définir la session (souterraine) puis appeler la méthode d'application comme si elle ne savait rien de la session. Ensuite, testez secrètement si le code de l'application a correctement mis à jour la session. Ou si l'application se comporte en fonction de la valeur de session définie par le test.
En fait, nous avons fini par nous moquer, même si j'ai dit: "ne vous moquez jamais". Parce que nous ne pouvions pas nous empêcher de passer à la règle suivante, "moquez-vous là où ça fait le moins mal!". Se
HttpContext
moquer d' énorme ou se moquer d'une minuscule séance, qui fait le moins mal? ne me demandez pas d'où viennent ces règles. Disons simplement le bon sens. Voici une lecture intéressante sur ne pas se moquer car le test unitaire peut nous tuerla source
La réponse @Ro Hit m'a donnée m'a beaucoup aidé, mais il me manquait les informations d'identification de l'utilisateur car je devais simuler un utilisateur pour les tests unitaires d'authentification. Par conséquent, permettez-moi de décrire comment je l'ai résolu.
Selon cela , si vous ajoutez la méthode
puis ajoutez
à la dernière ligne de la
TestSetup
méthode que vous avez effectuée, les informations d'identification de l'utilisateur sont ajoutées et prêtes à être utilisées pour les tests d'authentification.J'ai également remarqué qu'il existe d'autres parties de HttpContext dont vous pourriez avoir besoin, telles que la
.MapPath()
méthode. Il existe un FakeHttpContext disponible, qui est décrit ici et peut être installé via NuGet.la source
J'ai trouvé la solution simple suivante pour spécifier un utilisateur dans HttpContext: https://forums.asp.net/post/5828182.aspx
la source
Essayez de cette façon.
la source