Ich verwende Fluent NHibernate, um In-Memory-Datenbanktests (MS Test) mit SQLite 1.0.66.0 auszuführen:
[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;
}
}
Und dann wird dies als Beispiel verwendet:
[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.
}
}
}
Nachdem ich diesen Test durchgeführt habe, versuche ich Clean
die gesamte Lösung. Die Ergebnisse sind wie folgt:
- Bei der Durchführung dieses Tests (CTRL + R, CTRL + T) gelingt die Bereinigung wie erwartet.
- Bei der Fehlersuche in diesem Test (CTRL + R, T) wird die saubere scheitert mit dem Fehler:
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.
Mein erster Gedanke war: Ok, lösche die DLL. Wenn ich das versuche, werde ich aufgefordert, dass QTAgent32.exe
verwendet derzeit die DLL. Ich habe den Process Explorer verwendet, um dies zu überprüfen. Aus irgendeinem Grund behält der ms test runner eine Kontrolle über die DLL. Ich habe versucht, die Cleanup
metehod mit einigen Vorschlägen von weitere Frage aber es hat trotzdem nicht funktioniert:
[TestCleanup]
public void Cleanup()
{
new SchemaExport(this.configuration).Drop(false, true);
sessionFactory.Close();
sessionFactory.Dispose();
SQLiteConnection.ClearAllPools();
GC.Collect();
}
Ich konnte das Problem auf 3 verschiedenen Rechnern reproduzieren. Jede bekannte Methode zur Lösung dieses Problems wäre sehr willkommen.
Update : Ich habe einige sprachliche Unklarheiten beseitigt. Die eigentliche Konfiguration der Lösung kann in Debug/Relase erfolgen. Das Ausführen der Tests gegen Fehlersuche der Tests verursacht die unterschiedlichen Fehlermeldungen.