2010-07-13 13 views
6

Estoy tratando de crear una capa abstracta para ObjectContext. Entiendo que OC es una Unidad de Trabajo, pero no soy del todo la forma de escribir una buena interfaz para ello. Idealmente, me gustaría poder cambiar mi 'RealDataContext' que implementa IDataContext por algo así como 'FakeDataContext' que estaría completamente en la memoria.Crear interfaz para ObjectContext

La razón de esto es que quiero poder probar mis repositorios contra una base de datos en memoria.

Gracias!

Respuesta

7

Debería poder crear una clase extendida que se deriva de ObjectContext e implementa una interfaz IDataContext. Para poder burlarse realmente del ObjectContext, su interfaz IDataContext debería incluir firmas coincidentes (o propiedades) para cualquier miembro de ObjectContext que esté utilizando y desee burlarse. Algo parecido a lo siguiente debería ser suficiente:

interface IDataContext, IDisposable 
{ 
    void AddObject(string entitySetName, object entity); 
    void Attach(IEntityWithKey entity); 
    void Detach(object entity); 
    void DeleteObject(object entity); 
    int SaveChanges(); 
    int SaveChanges(bool acceptChangesDuringSave); 
    int SaveChanges(SaveOptions options); 

    // Any other members you wish to be mockable 
} 

class DataContext: ObjectContext, IDataContext 
{ 
    // nothing here 
} 

punto de vista técnico, ya que DataContext hereda todo, desde ObjectContect, la implementación de IDataContext está a cargo de ObjectContext. No debería necesitar ninguna implementación adicional en la clase DataContext. En tanto que siempre se inyecta (o usa una fábrica para crear) las instancias de IDataContext en lugar de ObjectContext, usted debe ser capaz de burlarse IDataContext cuando se prueba:

class SomeEntityRepository: IRepository<SomeEntity> 
{ 
    public SomeEntityRepository(IDataContext context) 
    { 
     m_context = context; 
    } 

    private readonly IDataContext m_context; 

    public SomeEntity GetById(long id) 
    { 
     // implementation 
    } 
} 

// xUnit.NET & Moq 
class SomeEntityRepositoryTests 
{ 
    [Fact] 
    public void GetById_returns_entity_when_valid_id_is_passed() 
    { 
     // state and context 
     var mockContext = new Mock<IDataContext>(); 

     // arrangement 
     mockContext.Setup(/* configure mock context here */); 
     var repo = new SomeEntityRepository(mockContext.Object); 

     // activity 
     var entity = repo.GetById(100); 

     // assertions 
    } 
} 
+0

Esta era la dirección que estaba inclinando hacia, pero no era realmente seguro si este es un buen enfoque. ¡Gracias! – TheCloudlessSky

+0

Glat para estar de servicio. :) – jrista

Cuestiones relacionadas