J'essaie de créer un test d'unité pour une méthode qui prend un objet HTTPResponse en tant que paramètre. Quelle est la bonne façon de faire cela? J'espère que vos testeurs de l'unité assaisonnés peuvent m'aider.
Le test échoue avec le message: system.web.httpException: la sortie introuvable n'est pas disponible lorsqu'un textwriter personnalisé est utilisé. em> la méthode testée fait partie d'une DLL de la bibliothèque de classe. Il utilise la sortie de la sortie de l'objet de réponse pour créer un russfeed avec un XMLWriter. p> p>
6 Réponses :
Pour être vraiment unitaire, vous devez vous moquer de HTTPResponse et tout le reste pour ne tester que votre code de méthode. Je ne connais aucun service utilitaire C # mobilier, mais ce Question pourrait aider .
Vous pouvez alors faire quelque chose comme ceci (l'exemple est Java avec Mockito): P>
HttpResponse response = mock(HttpResponse.class); OutputStream outputStream = mock(OutputStream.class); when(response.getOutputStream()).thenReturn(outputStream); RssGenerator.generate(response, otherParameters);
Le constructeur pour Vous devez configurer l'objet Vous pouvez utiliser .NET réflecteur pour creuser dans le < Code> HTTPRESPONSON CODE> classe et voyez ce qu'il fait. P> httpreesponse code> n'est pas destiné à votre utilisation, il est uniquement là pour le cycle de page ASP.NET à utiliser, il n'y a donc pas de documentation sur la création d'une. p>
httpreesponse code> de sorte qu'il utilise un httpwriter code>, sinon il ne vous laissera pas accéder au flux sous-jacent. Cependant, le constructeur définit la variable _httpwriter code> à null code>, vous devez donc trouver une autre façon de la définir. P>
Si je ne pouvais pas refroidir la signature de la méthode (la méthode n'a peut-être besoin que d'une valeur de HTTPResponse?), j'aurais eclipse générer une implémentation null de httpresponse (oui, je suis en Java, mais c'est la même chose Idée) - c'est-à-dire implémenter toutes les méthodes renvoyant null - et simplement remplir juste em> ceux dont j'ai besoin dans la méthode à tester et que leur retourne des valeurs constantes. (Ouais, pourrait aussi utiliser un cadre moqueur de quelque sorte.) P>
La raison pour laquelle vous ne pouvez pas créer votre propre instance de la mise en œuvre existante est qu'elle sera fortement liée à votre serveur d'applications et aura probablement besoin de toutes sortes d'autres gunk à être instanciées. P>
Si cela s'est avéré, j'ai besoin de quelque chose de plus compliqué qu'une simple version nulle de HTTPResponse, alors je ne regarderais pas à ne pas tester cette méthode directement: peut-être un test un ou deux niveaux supérieur serait plus simple et me fournirait le même niveau de confiance dans le code. p>
Donc, le problème de la moqueur de HTTPResponse est qu'il est scellé afin que vous ne puissiez pas l'étendre (et la plupart des cadres moqueurs qui se moquent de classes en béton qui écrivent les méthodes virtuelles). Microsoft était également assez gentille pour ne pas fournir des interfaces à la plupart d'entre elles ... alors merci Mme. P>
Pour cette raison (entre autres), je finis généralement à écrire mes propres interfaces pour toutes les classes MS scellées, puis à rédiger des implémentations de wrapper qui prennent la classe MS dans le constructeur et les shunts dans le plus tôt possible dans la demande. Ensuite, vous pouvez créer des simulacres des interfaces et leur faire faire ce que vous voulez. P>
besoin d'utiliser le système d'espace de noms.web.abstractions p>
en particulier, prenez un httpresponsebase ( http: // msdn .microsoft.com / fr-US / US / Bibliothèque / System.web.httpresponsebase.aspx ) En tant que paramètre d'entrée au lieu de HTTPResponse. Ensuite, vous pouvez vous moquer du HTTPRESPONSONSBASE de vos tests. Lorsque vous avez une vraie HTTPResponse à passer, utilisez httpresponsewrapper pour produire un HTTPresponseBase. P>
Il m'a fallu un moment pour trouver cela, alors voici: httpresponsewrapper wrapper = nouveau httpresponsewrapper (this.response); Comment faire ce que vous décrivez. HTTPRESPONSEWRAPPER prolonge HTTPresponseBase.
Si vous voulez une réponse plus détaillée, voici ce que j'ai terminé en faisant dans mon projet: où SendstringashTTTPresponse est défini comme p>
Comment avez-vous mis en œuvre la méthode Sendstring? Cela semble être le point clé ici;) au moins je ne l'obtiens pas.
Merci pour toutes les bonnes réponses. Je vous ferai savoir ce que je fais finalement avec cela.