Mock HttpContext.Current.Session dans les tests unitaires
Lors de l'écriture de tests unitaires pour un service Web qui accède à une valeur HttpContext.Current.Session
, une exception de référence nulle peut se produire si la session n'est pas initialisée. Pour résoudre ce problème, vous pouvez utiliser des sessions simulées pour les tests unitaires.
Une façon consiste à créer une simulation HttpSessionStateContainer
avec un nouveau HttpContext
. Voici comment procéder :
<code class="language-csharp">public static HttpContext FakeHttpContext() { var httpRequest = new HttpRequest("", "http://example.com/", ""); var stringWriter = new StringWriter(); var httpResponse = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponse); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Standard, new[] { typeof(HttpSessionStateContainer) }, null) .Invoke(new object[] { sessionContainer }); return httpContext; }</code>
Alternativement, comme suggéré par Brent M. Spell, vous pouvez ajouter HttpSessionStateContainer
directement à HttpContext
:
<code class="language-csharp">SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer);</code>
Utilisez cette session simulée dans les tests unitaires :
<code class="language-csharp">HttpContext.Current = MockHelper.FakeHttpContext();</code>
Avec cette approche, la valeur peut être définie sur HttpContext.Current.Session
lors des tests unitaires sans rencontrer d'exception de référence nulle, ce qui permet de tester minutieusement la fonctionnalité dépendante de la session du service Web.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!