0 votes

Moq, VB, HttpResponseBase et Headers

Je suis en train d'écrire un tas de tests autour de certains contrôleurs personnalisés en utilisant Moq en VB. Jusqu'à présent, je n'ai pas eu à faire face aux insuffisances de VB Lambda puisque je n'ai utilisé Moq que pour des propriétés ou des méthodes.

Jusqu'à ce matin où j'ai essayé d'exécuter des tests d'intégration avec Cassini sur mon code. J'avais du code pour ajouter des en-têtes en utilisant Response.Headers.Add. J'ai fait cela pour pouvoir facilement obtenir la collection d'en-têtes dans les tests unitaires en utilisant Moq(Of HttpResponseBase) et un SetupGet pour Headers->NameValueCollection. Bien sûr, le code s'étrangle dans tout ce qui n'est pas IIS7 en mode Integrated Pipeline.

J'ai donc modifié mon code pour utiliser Response.AddHeader, ce qui signifie que mes tests unitaires échouent. Et comme je suis en VB, je ne vois pas comment faire correspondre l'appel à AddHeader à la collection Headers puisque Function() a besoin d'une valeur de retour en VB.

J'ai vu quelques articles sur Moq et VB, mais personne n'a vraiment abordé le problème de la mise en correspondance de Subs avec autre chose dans Moq.

Quelqu'un a-t-il abordé cette situation particulière dans VB en utilisant Moq ?

1voto

claco Points 331

Ugh. Pourquoi les solutions deviennent-elles toujours apparentes APRÈS avoir été postées :-)

C'est moche, mais ça marche.

  • Sous-classe HttpResponseBase.
  • Simulez cela et mettez CallBase à True.

Ensuite, remplacez Add/AppendHeader par Headers.Add. Maintenant, vous attrapez toutes les variations que les gens utilisent dans le code car elles tombent toutes dans la collection Response.Headers. Le code réel fonctionne quelle que soit la méthode utilisée.

Pas aussi propre que Moqing Add/Append en C# avec des callbacks, mais cela fonctionne.

Dim response As New Mock(Of CustomHttpResponse)
response.SetupGet(Function(r As HttpResponseBase) r.Headers).Returns(New NameValueCollection)
response.CallBase = True

Public Class CustomHttpResponse
    Inherits HttpResponseBase

    Public Overrides Sub AddHeader(ByVal name As String, ByVal value As String)
        Me.Headers.Add(name, value)
    End Sub
    Public Overrides Sub AppendHeader(ByVal name As String, ByVal value As String)
        Me.Headers.Add(name, value)
    End Sub
End Class

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X