2009-07-21 7 views
6

J'essaie de tester unitaire une action du contrôleur qui utilise le fournisseur d'appartenance pour mettre à jour les détails de l'utilisateur. J'utilise Moq qui jusqu'ici a été facile à utiliser. Le problème est que je ne peux pas sembler l'obtenir pour se moquer des appels à des méthodes qui ne renvoient rien.Mocking Méthodes VB.NET avec Moq

<TestMethod()> _ 
Public Sub Can_Update_User() 
    ' Arrange 
    _membershipService.Setup(Function(x) x.UpdateUser(It.IsAny(Of MembershipUser))) 
    Dim controller As New UsersController(_membershipService.Object, _roleProvider.Object, _supportWorksService.Object, _portalClientService.Object) 
    ' Act 
    Dim result As ViewResult = controller.Edit("testUser", New FormCollection) 
    ' Assert 
    Assert.AreEqual("Index", result.ViewName) 
End Sub 

La configuration du service d'adhésion moquée ne compile pas, l'erreur est:

résolution de surcharge a échoué car aucun 'Configuration' accessible peut être appelé avec ces arguments:

'Fonction publique Setup (Of TResult) (expression As System.Linq.Expressions.Expression (Of System.Func (Of Services.IMembershipServic e, TResult))) Comme Moq.Language.Flow.ISetup (Of Services.IMembershipService, TResult) ': L'expression ne produit pas une valeur.

« Configuration de la fonction publique (de TResult) (expression Comme System.Linq.Expressions.Expression (de System.Func (de Services.IMembershipService, TResult))) Comme Moq.Language.Flow. ISetup (Of Services.IMembershipService, TResult) ': Le (s) type (s) de données du type paramètre (s) ne peuvent être déduits de ces arguments. Spécifier les données type (s) explicitement corriger cette erreur .

« Fonction publique Setup (expression Comme System.Linq.Expressions.Expression (de System.Action (de Services.IMembershipService))) Comme Moq.Language.Flow.ISetup (de Services.IMembershipService) ': L'expression n'a pas de valeur.

Qu'est-ce que j'ai manqué? Est-ce que je vais devoir créer une fausse classe plutôt que d'utiliser Moq chaque fois que ma classe a une méthode que je veux appeler?

Edit:

Ok, un peu de lecture suggère de contourner cela est dû à la façon lambdas sont exprimés en VB en utilisant la fonction() qui doit avoir un résultat.

Est-ce que quelqu'un a trouvé un travail pour cela ou vais-je devoir abandonner le Moq pour fausser les méthodes?

Répondre

6

Comme vous avez trouvé, la version actuelle de VB.NET (VB9) autorise uniquement les méthodes lambda qui renvoient une valeur (par exemple Function lambdas). Il n'y a pas vraiment grand-chose à faire à part ça à create a function to return a dummy value. Je ne peux pas le tester pour le moment, donc je ne suis pas sûr que ce soit une solution viable pour cette affaire.

Dans le next version of VB.NET (VB10), le langage prendra en charge Sub lambdas et devrait aider dans ces cas.

Il semble que d'autres personnes soient également having trouble de différents degrés avec la combinaison Moq/VB.NET actuelle.

+0

:(Honte vraiment, en dehors de cela, j'adore vraiment Moq .Si je suggère au patron que nous retardons le développement pour une autre année afin qu'ils puissent sortir VB10 je pense qu'il va me tuer! – Nick

1

Il semble que this scelle l'accord.

Un peu décevant - enquête m'a pris pas mal de temps. :/

0

Typemock a un support pour VB.NET API conviviale à cette fin: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

+3

Malheureusement comme un petit groupe de développeurs internes, nous ne pouvons pas justifier le coût de TypeMock Actuellement, nous écrivons simplement des méthodes que nous devons mocker comme des fonctions qui retournent un booléen et attendent VB10. – Nick

7

Dans Visual Studio 2010 utilisation

serviceMock.Setup(Sub(c) c.MethodName(paramName)) 

Aussi, assurez-vous que l'entité moqué (serviceMock) est soit moqué comme une interface, ou a MethodName déclaré comme overrideable.