Подтвердить что ты не робот

SQLite.Interop.dll заблокирован после запуска Visual Studio 2012 Unit Test Рамочные тесты

  • Visual Studio 2012
  • SQLite 1.0.82.0 (из nuget)

Я пытаюсь использовать команду "Запустить все" в "Проводнике тестеров", Следующая ошибка возникает после запуска теста один раз... после этого он больше не будет создан, пока вы не перезапустите визуальную студию

Вот ошибка сборки

Процесс не может получить доступ к файлу "SQLite.Interop.dll", поскольку он используется другим процессом

вот код

using System.Data.SQLite;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test.Sqlite
{
    [TestClass]
    public class Test_Sqlite_Locking
    {
        [TestMethod]
        public void can_create_table()
        {
            using(var fact = new SQLiteFactory())            
            using (var conn = fact.CreateConnection())
            {
                conn.ConnectionString = "Data Source=:memory:;Version=3;New=True;";
                conn.Open();
                //conn.Close();                
            }

            //SQLiteConnection.ClearAllPools();
            //GC.Collect();
        }
    }
}

Я пытался, закрывая соединение, вызывая ClearAllPools, GC.Collect и создавая SQLiteConnection напрямую (вместо Factory)... еще одна проблема

Это работает, если вы ДОЛЖНЫ ВСЕХ ИСПЫТАНИЙ... но это просто, когда вы просто запускаете тесты, которые, похоже, блокируют его.

4b9b3361

Ответ 1

Я не мог найти эту опцию в VS2012 (по крайней мере, не для стандартных модульных тестов), поэтому я придумал другое решение:

Проблема, с которой вы сталкиваетесь, связана с тем, что бегун unit test остается загруженным, чтобы повторные тесты выполнялись быстрее. Поскольку SQLite.Interop.dll, вероятно, не будет меняться слишком часто, я изменил параметр CopyToOutputDirectory на PreserveNewest, а не по умолчанию Always.

Вы можете сделать это, открыв представление свойств (F4) и выбрав SQLite.Interop.dll файл в своем решении. Единственный раз, когда это, вероятно, все еще будет заблокировано, - это когда вы обновляетесь до более новой версии SQLite и перезапускаете VS2012, тогда работает нормально для меня.

Ответ 2

Я работал над этим, используя следующее в качестве события предварительной сборки в затронутых тестовых проектах:

для 64-битного:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"

или для 32-битного:

taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"

Это тихо убивает механизм выполнения перед созданием тестового проекта. /FI "MEMUSAGE gt 1" останавливает выполнение команды (и, следовательно, сборку), если механизм выполнения не запущен.

Ответ 3

Попробуйте следующее:

  • В VS.NET нажмите "Сервис\Параметры"
  • Когда появится диалоговое окно, нажмите "Инструменты тестирования"
  • Нажмите "Тестирование"
  • Снимите флажок "Держите механизм проверки выполнения между тестами"
  • Нажмите "ОК" и перезапустите VS.NET

Теперь вы можете запускать тесты на основе SQLite без перезагрузки.

Ответ 4

В Visual Studio 2013 - перейдите в раздел "Тестирование > Параметры тестирования > сохранить запуск тестового запуска" и снимите флажок! Работает для меня.

Ответ 5

Обходной путь предоставленный Филиппом Аумайром (опция CopyToOutputDirectory для PreserveNewest, а не по умолчанию Always) работает для большинства сценариев, но не для всех, К сожалению. Как отмечают другие вопросы по SO, факт, что vstest.executionengine не заканчивается, является распространенной проблемой в VS2012 - хуже, разработчики Microsoft рассматривают это как функцию и по дизайну, Опция предотвращения такого поведения существовала в VS2010, но была удалена в VS2012.

Если у вас тоже есть проблемы с этим "улучшением", тогда проголосуйте за вопрос поддержки Microsoft Connect vstest.executionengine.x86.exe(32 бит) - не закрывается (влияет на x86 и x64, несмотря на заголовок).

Ответ 6

Я знаю, что этот вопрос старый, но у меня была эта проблема, и некоторые из ответов здесь вызвали идею. Одна из первых проблем, с которыми я столкнулась при попытке создания тестов unit/integration в SQLite, заключалась в том, что MSTest (который мы используем для скриптовых построений) не развертывал все необходимые зависимости в тестовом прогоне "Out" перед запуском теста, поэтому тесты не удались. Лучший способ решить эту проблему - добавить эти атрибуты в мой тестовый класс:

[TestClass]
**[DeploymentItem("System.Data.SQLite.dll")]
[DeploymentItem("x86\\SQLite.Interop.Dll")]**
public class TestClass

Это, похоже, также решает эту проблему... Я предполагаю, что это приводит к тому, что VSTest загружает другую копию этих зависимостей, чтобы VSBuild все еще мог делать то, что будет, с копией в вашем обычном каталоге/bin/.

Ответ 7

Также убедитесь, что ваша база данных установлена ​​в правильную папку
Строки соединения SQLite

Адаптер данных, который вы также можете попробовать с помощью SQL Lite Использование SQLitew с .NET

SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.FailIfMissing = true;
builder.DataSource = "Insert the fully qualified path to your sqlite db";
SQLiteConnection connection = new SQLiteConnection(builder.ConnectionString);
try
{
  connection.Open();
}
catch(SqlException exp)
{
    // Log what you need from here.
    throw new InvalidOperationException("Whatever exception you want to throw", exp);
}

Прочтите эту статью, чтобы узнать, помогает ли она исправлять вашу проблему Билет System.Data.SQLite.View

Ответ 8

Попробуйте использовать соединение, как показано ниже. Это сработало для меня.

    private void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            if (_dbConnection != null)
            {
                _dbConnection.Cancel();
                _dbConnection.Close();
                _dbConnection.Dispose();
            }
        }

        _disposed = true;
    }