2012-05-26 25 views
7

Estoy usando PetaPoco en mi proyecto actual como un micro ORM y debo decir que me gusta. Sin embargo, me encontré luchando con sencillo escenario - servicios de pruebas de unidad que utilizan PetaPoco.DatabaseCómo probar el servicio de unidad que está utilizando PetaPoco.Database

public class MyService : IMyService 
{ 
    private readonly PetaPoco.Database _database; 

    public MyService(PetaPoco.Database database) 
    { 
     _database = database; 
    } 

    public void SaveSomething(MyObject myObject) 
    { 
     //...custom logic 
     _database.Save(myObject); 
    } 
} 

estoy usando COI (Castle.Windsor) para la inyección de ambos IMyService y PetaPoco.Database donde sea necesario.

Ahora, cuando intento unidad de probar mi servicio no puedo adecuadamente talón de simulacro PetaPoco.Database con el fin de verificar que el método Guardar se invocó correctamente. Estoy usando NUnit y Rhino.Mocks para pruebas unitarias y burlas.

[TestFixture] 
public class MyServiceTests 
{ 

    private PetaPoco.Database _database; 

    [SetUp] 
    public void SetUp() 
    { 
     _database = MockRepository.GenerateMock<Database>(""); 
    } 

    [Test] 
    public void ShouldProperlySaveSomething() 
    { 
     //Arrange 
     var myObject = new MyObject(); 
     _database.Expect(db => db.Save(Arg<MyObject>.Is.Anything)); 
     var myService = new MyService(_database); 

     //Act 
     myService.SaveSomething(myObject); 

     //Assert 
     _database.VerifyAllExpectations(); 
    } 

} 

Soy consciente de que esto puede ser resuelto si extraigo una interfaz de PetaPoco.Database y hacer la burla en contra de ella, o mediante la virtualización de los métodos de PetaPoco que quiero para burlarse, pero el punto es que yo No quiero hacer cambios en PetaPoco en absoluto.

¿Es esto factible?

Respuesta

4

Mi sucursal ubicada aquí: https://github.com/schotime/PetaPoco ya tiene una interfaz definida para la clase de Base de datos.

También está mi nuevo Fork https://github.com/schotime/NPoco o NPoco en nuget que tiene la misma API.

Yo usaría uno de estos. ;)

+0

¡Gran trabajo @Schotime, eso es exactamente lo que necesitaba! Aunque tengo curiosidad, ¿ha intentado crear solicitudes de extracción para la base de código original? – ljubomir

+0

Muchas veces, pero tengo muchas más funciones como parte de la biblioteca ahora, con muchas correcciones de errores, por lo que ahora están casi dos separadas. – Schotime

+0

¿Son compatibles todas las características de petapoco (como plantillas) o falta algo? Parece que tu fork también hace lo que hace este complemento PetaPoco.RelationExtensions. ¿Estás usando el mismo código?Me pregunto si no tiene documentación sobre algunas de sus funciones, por lo que espero poder utilizar ejemplos de otros complementos existentes. – chobo2

1

Ya estás abstrayendo las interacciones con PetaPoco.Database usando las interacciones de IMyService, entonces ¿para qué necesitas otra abstracción? Con su enfoque actual, debería poder probar las interacciones con la base de datos usando IMyService, p.

public class AuthenticationService 
{ 
    private IMyService myService; 

    public AuthenticationService(IMyService service) 
    { 
     ... 
    } 

    public void Authenticate(string username, string password) 
    { 
     var user = myService.GetUser(username); // <-- Hits the database 
    } 
} 

y para probarlo simplemente simula interacciones utilizando un simulacro/stub de IMyService.

Ahora, con respecto a su solución original, si los métodos públicos de PetaPoco no son virtuales, lo bifurcaré, corregiré el código y les enviaré una solicitud de extracción. De lo contrario, su enfoque se ve bien para mí.

+1

Gracias por su respuesta @Hadi. El punto que planteo a esta pregunta radica en el hecho de que quiero probar la lógica comercial MyService de forma aislada, es decir, no quiero acceder a la base de datos, y al mismo tiempo quiero asegurarme de que las llamadas a la base de datos se desencadenen a través de PetaPoco. De la forma en que lo veo, esto solo es posible burlándose de ** PetaPoco.Database **. – ljubomir

+0

Bifurcar el código, por otro lado parece una buena solución para mí, podría intentarlo. – ljubomir

Cuestiones relacionadas