2011-06-04 8 views
6

estoy usando NHibernate Fluido para funcionar en memoria pruebas de base de datos (MS) de prueba utilizando SQLite 1.0.66.0:VS MSTest corredor cerraduras System.Data.SQLite.dll cuando se ejecuta en la memoria Pruebas de

[TestClass] 
public abstract class InMemoryDatabaseTest 
{ 
    private NHibernate.Cfg.Configuration configuration; 
    private ISessionFactory sessionFactory; 

    [TestInitialize] 
    public void Initialize() 
    { 
     // All "CreateConfiguration" does is load FNh mappings. 
     this.configuration = new NhConfigurationBuilder() 
      .CreateConfiguration() 
      .Database(() => SQLiteConfiguration.Standard.InMemory()) 
      .BuildConfiguration(); 

     this.sessionFactory = this.configuration.BuildSessionFactory(); 
    } 

    [TestCleanup] 
    public void Cleanup() 
    { 
     new SchemaExport(this.configuration).Drop(false, true); 
     sessionFactory.Dispose(); 
    } 

    protected ISession CreateSession() 
    { 
     var session = this.sessionFactory.OpenSession(); 

     // Re-create the database every time a new session is created. 
     new SchemaExport(this.configuration) 
      .Execute(script: false, export: true, justDrop: false, connection: session.Connection, exportOutput: null); 

     session.BeginTransaction(); 
     return session; 
    } 
} 

Y a continuación, utilizando esto como un ejemplo:

[TestClass] 
public class MessagesControllerTests : InMemoryDatabaseTest 
{ 
    [TestMethod] 
    public void SQLite_should_have_all_handles_released() 
    { 
     using (var session = this.CreateSession()) 
     { 
      // Don't even need to do anything. 
     } 
    } 
} 

Después de ejecutar esta prueba, trato de Clean toda la solución. Los resultados son los siguientes:

  • Al ejecutar esta prueba (CTRL + R, CTRL + T), la limpieza puede tener el éxito esperado.
  • Al depurar esta prueba en (CTRL + R, T), la limpieza falla con el error: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3607,9): warning MSB3061: Unable to delete file "PathToProject\bin\Debug\System.Data.SQLite.DLL". Access to the path 'PathToProject\bin\Debug\System.Data.SQLite.DLL' is denied.

Mi primer pensamiento fue bien, borra el archivo DLL. Cuando intento hacerlo, me indican que QTAgent32.exe está usando actualmente el DLL. Usé Process Explorer para verificar esto. Por algún motivo, el corrector de prueba ms mantiene un control sobre el archivo DLL. He intentado modificar el metehod Cleanup con algunas sugerencias de another question, pero todavía no ha funcionado:

[TestCleanup] 
public void Cleanup() 
{ 
    new SchemaExport(this.configuration).Drop(false, true); 
    sessionFactory.Close(); 
    sessionFactory.Dispose(); 
    SQLiteConnection.ClearAllPools(); 
    GC.Collect(); 
} 

que he sido capaz de reproducir esto en 3 máquinas diferentes. Cualquier método conocido para resolver este problema sería muy apreciado.

Actualización: He limpiado algunas confusiones lingüísticas. La configuración de la solución real puede estar en Debug/Relase. Sin embargo, ejecutar las pruebas frente a la depuración de las pruebas causa la diferencia en los mensajes de error.

+0

¿por qué limpiar? –

+0

Bueno, solo para asegurarnos de que la base de datos esté completamente destruida. – TheCloudlessSky

+0

Es extraño que la ruta en el mensaje de error sea bin \ Debug incluso si compila en modo Release –

Respuesta

0

Estaba teniendo continuamente un problema similar (SQLite.dll bloqueado por el examinador de Visual Studio, aunque en modo Debug mayormente y usando pruebas de MbUnit) y encontré que usar TestDriven.net para ejecutar mis pruebas me solucionó el problema . Nunca busqué más en el corredor MSTest después de esto, lo siento.

Cuestiones relacionadas