Бегун VS MSTest блокирует System.Data.SQLite.dll при запуске в тестах памяти - PullRequest
7 голосов
/ 04 июня 2011

Я использую 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.Однако выполнение тестов по сравнению с отладкой тестами приводит к разнице в сообщениях об ошибках.

1 Ответ

0 голосов
/ 23 июня 2011

У меня постоянно была похожая проблема (SQLite.dll блокировался бегунком тестов Visual Studio, хотя в основном в режиме отладки и с использованием тестов MbUnit) и обнаружил, что использование TestDriven.net для запуска моих тестов решило эту проблему для меня.После этого я никогда не заглядывал в бегуна MSTest, извините.

...