8
votes

Test de l'unité pour une méthode qui prend un objet HTTPResponse sous forme de paramètre. La sortie n'est pas disponible

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.

Informations supplémentaires: J'ai essayé de créer un faux objet HTTPResponse en passant dans un StringWriter. xxx

Le test échoue avec le message: system.web.httpException: la sortie introuvable n'est pas disponible lorsqu'un textwriter personnalisé est utilisé. 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.


1 commentaires

Merci pour toutes les bonnes réponses. Je vous ferai savoir ce que je fais finalement avec cela.


6 Réponses :


3
votes

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);


0 commentaires

1
votes

Le constructeur pour httpreesponse 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.

Vous devez configurer l'objet httpreesponse de sorte qu'il utilise un httpwriter , sinon il ne vous laissera pas accéder au flux sous-jacent. Cependant, le constructeur définit la variable _httpwriter à null , vous devez donc trouver une autre façon de la définir.

Vous pouvez utiliser .NET réflecteur pour creuser dans le < Code> HTTPRESPONSON classe et voyez ce qu'il fait.


0 commentaires

0
votes

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 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.)

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.

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.


0 commentaires

1
votes

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.

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.


0 commentaires

13
votes

besoin d'utiliser le système d'espace de noms.web.abstractions

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.


1 commentaires

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.



2
votes

Si vous voulez une réponse plus détaillée, voici ce que j'ai terminé en faisant dans mon projet: xxx

où SendstringashTTTPresponse est défini comme xxx < / p>


1 commentaires

Comment avez-vous mis en œuvre la méthode Sendstring? Cela semble être le point clé ici;) au moins je ne l'obtiens pas.