2012-09-13 14 views

Respuesta

5

En resumen, no se puede. Es por eso que cada llamada a dicho "servicio" debe ocultarse detrás de una abstracción.

Puede ver una muestra de eso en la plantilla MVC predeterminada.

+1

¿Puedes elaborar? La plantilla usa WebSecurity.Login(). ¿Cuál es una buena forma de abstraer eso para que las pruebas de unidad no lleguen realmente a la base de datos? – GWTF

+2

Encontré esto que parece prometedor: http://blog.spontaneouspublicity.com/unit-testing-the-mvc4-account-controller. ¿Es ese el tipo de abstracción del que estás hablando? – GWTF

+0

@Scott enlace roto. –

3

Sí, como dijo Serg, puede burlarse de esto proporcionando una interfaz para el servicio real para implementar. Esta interfaz tendría los métodos públicos que llama, tales como:

public interface IMyServiceInterface 
{ 
    IMembershipUser GetUser(); 
    // other methods you want to use... 
} 

En las pruebas unitarias, se podría decir:

var mockService = new Mock<IServiceInterface>(); 
mockService.Setup(mock => mock.GetUser()). 
    Returns(new MembershipUserImplementation("MyTestUser", otherCtorParams)); 

En mi ejemplo, me gustaría crear un contenedor para MembershipUser, así como parece que también necesita estar detrás de una abstracción.

+0

¿Qué marco de burla estás usando en el ejemplo? –

+0

Uso [Moq] (http://code.google.com/p/moq/). Es simple y hace todo lo que necesito que haga. – sfogle

Cuestiones relacionadas