Comment me moquer de HttpResponseBase.End ()?

J’utilise Moq pour créer un object fictif de HttpResponseBase. Je dois pouvoir tester que HttpResponseBase.End () a été appelé dans ma bibliothèque. Pour ce faire, je spécifie du texte avant l’appel et du texte après. Ensuite, je vérifie que seul le texte précédant l’appel de End () est présent dans HttpResponseBase.Output.

Le problème est que je ne vois pas comment se moquer de HttpResponseBase.End () pour qu’il arrête le traitement, comme dans ASP.NET.

public static HttpResponseBase CreateHttpResponseBase() { var mock = new Mock(); SsortingngWriter output = new SsortingngWriter(); mock.SetupProperty(x => x.StatusCode); mock.SetupGet(x => x.Output).Returns(output); mock.Setup(x => x.End()) /* what do I put here? */; mock.Setup(x => x.Write(It.IsAny())) .Callback(s => output.Write(s)); return mock.Object; } 

Je ne sais pas trop ce que vous essayez d’atteindre, mais d’après votre description, il semble que vous tentiez de faire en sorte que votre Abstraction se comporte comme une implémentation particulière. En d’autres termes, étant donné que HttpResponse.End () a un certain comportement, vous voulez que votre Mock ait le même comportement?

En général, cela n’est pas particulièrement facile à faire avec Moq, car il n’a pas de concept d’attentes ordonnées (contrairement à RhinoMocks). Il y a cependant une demande de fonctionnalité pour cela .

Vous pourrez peut-être utiliser un rappel avec la configuration de la méthode End pour faire basculer un indicateur qui détermine tout comportement ultérieur du Mock, mais cela ne sera pas particulièrement joli. Je pense à quelque chose comme ça:

 bool ended = false; var mock = new Mock(); mock.Setup(x => x.End()).Callback(() => ended = true); // Other setups involving 'ended' and Callbacks 

Ensuite, tous les autres programmes d’installation ont une double implémentation, selon que l’opération ended est vraie ou fausse.

Ce serait sacrément moche, alors je reconsidérerais sérieusement mes options pour le moment. Il y a au moins deux directions que vous pouvez prendre:

  1. Faites une implémentation fictive de HttpResponseBase au lieu d’utiliser Moq. On dirait que vous attendez un comportement spécifique de la mise en œuvre qu’un test de double avec logique intégrée semble être une meilleure option. En bref, un Fake est un Test Double pouvant contenir une logique semi-complexe imitant l’implémentation de production prévue. Vous pouvez en savoir plus sur Fakes et autres tests doubles dans l’excellent livre xUnit Test Patterns .
  2. Reconsidérez vos hypothèses initiales. Il me semble que vous attachez votre client très étroitement à un comportement particulier de HttpResponseBase, de sorte que vous enfreignez peut-être le principe de substitution de Liskov. Cependant, je me trompe peut-être, car une méthode appelée «End» porte certaines connotations au-delà de la pure sémantique, mais je me demanderais personnellement si une meilleure conception était possible.