2009-07-21 13 views
6

estoy tratando de probar la unidad una acción de controlador que utiliza el proveedor de pertenencia para actualizar los datos de usuario. Estoy usando Moq, que hasta ahora ha sido fácil de usar.burlando de Métodos VB.NET Con Moq

El problema es que parece que no puede conseguir que se burlan de las llamadas a métodos que no devuelven nada.

<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 configuración del servicio de suscripción burlado no se compilará, el error es:

resolución de sobrecarga fracasó porque no accesible 'Configuración' puede ser llamada con estos argumentos:

'Función pública Configuración (de TResult) (expresión Como System.Linq.Expressions.Expression (Of System.Func (Of Services.IMembershipServic e, TResult))) Como Moq.Language.Flow.ISetup (Of Services.IMembershipService, TResult) ': Expression no produce un valor.

'Configuración de la Función Pública (De TResult) (expresión Como System.Linq.Expressions.Expression (De System.Func (De Services.IMembershipService, TResult))) Como Moq.Language.Flow. ISetup (Of Services.IMembershipService, TResult) ': El (los) tipo (s) de datos del tipo parámetro (s) no se pueden inferir de estos argumentos. La especificación de los datos tipo (s) podría explícitamente corregir este error .

'Función Pública configuración (expresión como System.Linq.Expressions.Expression (De System.Action (De Services.IMembershipService))) Como Moq.Language.Flow.ISetup (De Services.IMembershipService) ': La expresión no produce un valor.

Qué me he perdido? ¿Voy a tener que crear una clase falsa en lugar de usar Moq cada vez que mi clase tenga un método al que quiera llamar?

Editar:

Ok, un poco de lectura en torno sugiere que esto se debe a la forma en lambdas se expresan en VB usando la función() que debe tener un resultado.

Alguien ha encontrado una solución alternativa para esto o voy a tener que deshacerse de Moq por falsificar métodos?

Respuesta

6

Como ha encontrado, la versión actual de VB.NET (VB9) solo permite que los métodos lambda devuelvan un valor (es decir, Function lambdas). No hay mucho más que pueda hacer al respecto que no sea create a function to return a dummy value. No puedo probarlo en este momento, así que no estoy seguro de que sea una solución viable para este caso.

En el next version of VB.NET (VB10), el lenguaje admitirálambdas y debería ayudar en estos casos.

Parece que otras personas también son having trouble de diferentes grados con la combinación actual de Moq/VB.NET.

+0

:(Es una pena realmente, aparte de esto, estoy realmente amando a Moq. Si sugiero al jefe, posponemos el desarrollo por otro año para que puedan sacar el VB10 ¡Creo que me matará! – Nick

1

Parece que this cierra el trato.

Kind una decepcionante - investigación me llevó mucho tiempo. :/

0

Typemock tiene soporte para la API de usar VB.NET para tal fin: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

+3

Desafortunadamente como pequeño grupo de desarrolladores internos no podemos justificar el costo de TypeMock. Actualmente solo estamos escribiendo métodos que necesitamos para simular como funciones que devuelven un booleano y esperando por VB10. – Nick

7

En Visual Studio 2010 uso

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

Además, asegúrese de que la entidad burlado (serviceMock) o bien se burló como una interfaz, o ha declarado MethodName como overrideable.