Я использую Fluent NHibernate для запуска тестов базы данных в памяти (MS Test) с использованием SQLite 1.0.66.0:
[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;
}
}
И затем использую это в качестве примера:
[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.
}
}
}
После выполнения этого теста, я пытаюсь Clean
все решение.Результаты следующие:
- При выполнении этого теста (CTRL + R, CTRL + T) очистка может завершиться успешно, как и ожидалось.
- При отладке этого теста в (CTRL + R, T), очистить не удалось с ошибкой:
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.
Моя первая мысль была в порядке, удалите DLL.Когда я пытаюсь это сделать, мне подсказывают, что QTAgent32.exe
в настоящее время использует DLL.Я использовал Process Explorer, чтобы проверить это.По какой-то причине MS Test Runner хранит дескриптор DLL.Я попытался изменить метод Cleanup
с некоторыми предложениями из другого вопроса , но он все еще не работал:
[TestCleanup]
public void Cleanup()
{
new SchemaExport(this.configuration).Drop(false, true);
sessionFactory.Close();
sessionFactory.Dispose();
SQLiteConnection.ClearAllPools();
GC.Collect();
}
Я смог воспроизвести это на 3разные машины.Любой известный метод для решения этой проблемы будет принята с благодарностью.
Обновление : Я устранил некоторую языковую путаницу.Фактическая конфигурация решения может быть в Debug / Relase.Однако выполнение тестов по сравнению с отладкой тестами приводит к разнице в сообщениях об ошибках.