2011-03-31 19 views
6

Primero intenta realizar algunas pruebas unitarias con el código EF 4.1. Tengo mi live db (SQL Server) y mi unidad de prueba DB (Sql CE). Después de luchar (y perder) con EF, SQL CE 4.0 y soporte de transacción que decidieron la forma más sencilla de ejecutar mi prueba era:Entity Framework 4.1 "Code First" No se vuelve a llamar a SetInitializer después de Database.Delete

  1. Crear prueba Db
  2. Run
  3. Eliminar Db
  4. Enjuague y repetir

tengo mi [Configuración] y [] tearDown funciones:

[SetUp] 
public void Init() 
{ 
    System.Data.Entity.Database.SetInitializer(new MyTestContextInitializer()); 
    _dbContext = ContainerFactory.Container.GetInstance<IContext>(); 
    _testConnection = _dbContext.ConnectionString; 
} 

[TearDown] 
public void Cleanup() 
{ 
    _dbContext.Dispose(); 
    System.Data.Entity.Database.Delete(_testConnection); 
} 

El problema es que System.Data.Entity.Database.SetInitializer no llama a MyTestContextInitializer después de la primera prueba.

De ahí la segunda prueba a continuación, falla con:

System.Data.EntityException: El proveedor subyacente falló en Abrir.
----> System.Data.SqlServerCe.SqlCeException : No se puede encontrar el archivo de base de datos. Compruebe la ruta a la base de datos

TIA para cualquier punteros

Respuesta

7

llegué alrededor de esta llamando 'InitializeDatabase' manualmente. Como tal:

[SetUp] 
    public void Init() 
    { 

     var initializer = new MyTestContextInitializer(); 
     System.Data.Entity.Database.SetInitializer(initializer); 

     _dbContext = ContainerFactory.Container.GetInstance<IContext>(); 
     initializer.InitializeDatabase((MyTestContext)_dbContext); 

     _testConnection = _dbContext.ConnectionString; 
    } 

    [TearDown] 
    public void Cleanup() 
    { 
     System.Data.Entity.Database.Delete(_testConnection); 

     _dbContext.Dispose(); 
    } 

Creo que puede ser un error con EF 4.1 RC.

+0

Encantador, eso me ayudó a resolver lo que pensaba que era bloquear el archivo DB (CE 4) entre los dispositivos de prueba. +1 :) –

+0

Brilliant! Tenía exactamente este problema, con EF5 no menos, y he estado atrapado en él por un tiempo. Esto me lo arregló, gracias. –

2

No es un insecto, el inicializador conjunto con

System.Data.Entity.Database.SetInitializer 

sólo se invoca cuando se crea el contexto para la primera vez en el dominio de aplicación. Por lo tanto, dado que está ejecutando todas sus pruebas en un único dominio de aplicación, solo se invoca cuando se ejecuta la primera prueba.

1

Me llevó casi un día averiguar qué causó mi extraño comportamiento de prueba de unidad: la conexión de la base de datos permaneció abierta o la base de datos no se creó con cada nueva prueba. Busqué en todas partes la raíz de la causa: MSTest (sin derechos de administrador o donde se borraron copias de archivos de alguna manera?), SQL Server Express/CE (¿error de inicio de sesión?), Unity (¿objetos no eliminados?) O Entity Framework (no apropiado inicialización de la base de datos?). Resultó ser EF. ¡Muchas gracias por la respuesta!

Cuestiones relacionadas