2012-09-16 33 views
5

Mi problema es que quiero colgar una propiedad en mi clase abstracta porque mi clase en prueba usa esa propiedad. Actualmente estoy usando la última versión de Moq.Unidad probando una clase que hereda de una clase abstracta

Mi clase abstracta se ve así:

public abstract class BaseService 
{ 
    protected IDrawingSystemUow Uow { get; set; } 
} 

Y mi clase de prueba es el siguiente:

public class UserService : BaseService, IUserService 
{ 
    public bool UserExists(Model model) 
    { 
     var user = this.Uow.Users.Find(model.Id); 
     if(user == null) { return false; } 

     reurn true; 
    } 
} 

no puedo averiguar cómo puedo derivadas La propiedad Uow. ¿Alguien tiene alguna pista? ¿O es mi diseño tan malo que tengo que moverme a la propiedad Uow a mi clase en prueba?

Respuesta

9

Su configuración actual no funcionará por una simple razón: la propiedad Uow no se puede invalidar y el trabajo de Moq se realiza en este momento. Cannot override, cannot mock.

La solución más sencilla es simplemente invalidar esa propiedad. Cambiar la definición de la clase base para:

public abstract class BaseService 
{ 
    protected virtual IDrawingSystemUow Uow { get; set; } 
} 

Ahora puede utilizar protegida función de Moq (esto requiere que se incluyan using Moq.Protected espacio de nombres en su clase de prueba):

// at the top of the file 
using Moq.Protected; 

// ... 

var drawingSystemStub = new Mock<IDrawingSystemUow>(); 
var testedClass = new Mock<UserService>(); 
testedClass 
    .Protected() 
    .Setup<IDrawingSystemUow>("Uow") 
    .Returns(drawingSystemStub.Object); 

// setup drawingSystemStub as any other stub 

// exercise test 
var result = testedClass.Object.UserExists(...); 
+0

¡Muchas gracias, realmente ayudó! Fue un error menor en su fragmento de código. Las devoluciones (drawingSystemStub) se deben reemplazar con Returns (drawingSystemStub.Object). =) – Rikard

+0

@Rikard: gracias, arreglado. –

+0

FYI @jimmy_keen - Enlace para "No puede anular, no puede burlarse" roto – lukejkw

0

Creo que en su caso se trata de muy claro. Simplemente no se burla de la propiedad Uow, sino del servicio IDrawingSystemUow. Entonces puede crear un simulacro de IDrawingSystemUow, asignarlo a la instancia de UserService a través de la propiedad Uow y luego ejecutar las pruebas (por ejemplo, del método UserExists).

Cuestiones relacionadas