2012-10-08 9 views
5

Estoy abstrayendo mi DbContext en un intento de abordar Separate of Concerns y hacer que mi código sea comprobable por unidad. Para hacer eso, he creado la siguiente interfaz.En caso de que el proyecto de prueba unitaria tenga referencia a dll de EF cuando se abstraiga el contexto

Esta interfaz a continuación se aloja en la Asamblea llamada AllInterfaces. Este proyecto tiene una referencia a EF dll debido a IDbSet en la declaración a continuación.

public interface ISalesContext : IDisposable 
{ 
    IDbSet<Customer> Customers { get; } 
    IDbSet<Order> Orders { get; } 
    IDbSet<Product> Products { get; }  
}  

También creé un conjunto de db falso de la siguiente manera.

public class FakeDataSet<T> : IDbSet<T> where T: class, new() 
{ 
....... 
} 

Por lo tanto, para mi objeto Cliente, este conjunto de datos falso se muestra a continuación.

public class FakeCustomerDbSet : FakeDbSet<Customer> 
    { 
    .............. 
    } 

Luego creé mi contexto falso de la siguiente manera.

public class FakeSalesContext : ISalesContext 
    { 
     public FakeSalesContext() 
     { 
      Customers = new FakeCustomerDbSet(); 

     } 

     public IDbSet<Customer> Customers { get; set; } 
     public IDbSet<Order> Orders{ get; private set; } 
     public IDbSet<Product> Products { get; private set; } 

     public void Dispose() 
     { 

     } 
    } 

Todas las clases anteriores (FakeDataSet, FakeCustomerDbSet y FakeSalesContext) relacionados con los objetos falsos viven en una asamblea AllFakes. Tuve que agregar una referencia a EF dll ya que la interfaz IDbSet también se menciona en estas clases falsas.

Luego tengo mi proyecto de prueba de unidad donde estoy usando objetos falsos para realizar pruebas unitarias.

ISalesContext Context = new FakeSalesContext(); 
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" }); 

El problema es que esta prueba de unidad requiere que agregue referencia a Entity framework dll. Si elimino la referencia de EF, obtengo el siguiente error de compilación.

El tipo 'System.Data.Entity.IDbSet`1' se define en un conjunto que no se hace referencia. Debe agregar una referencia al ensamblado 'EntityFramework, Version = 4.4.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'.

Si elimino la referencia EF dll del ensamblaje AllFakes, aparece un error de seguimiento.

El tipo o espacio de nombres 'IDbSet' no se pudo encontrar (está usted falta una directiva using o una referencia de ensamblado?)

¿Tiene sentido para agregar una referencia a EF DLL para todas estas asambleas? Para mí, como he abstraído mi contexto db, no debería ser necesario aquí. ¿Alguna sugerencia sobre cómo lograr eso?

Respuesta

2

Creo que necesita una referencia a EF dll. Hizo abstracción de su contexto pero su abstracción todavía está utilizando la interfaz IDbSet que se define en EntityFramework.dll. FakeSalesContext expone propiedades públicas de tipo IDbSet si no agrega una referencia a EntityFramework.dll (donde se define IDbSet) las cosas no se compilarán ya que el compilador no sabrá qué es IDbSet.

1

En este caso, no veo ningún problema. Siempre que solo esté probando las implementaciones DbContext, la referencia en sí es solo para la resolución de dependencia de su objeto de contexto.

Cuestiones relacionadas