Очистка теста интеграции Windows SQLite («невозможно открыть файл базы данных») - PullRequest
0 голосов
/ 29 августа 2018

Я добавил 2 интеграционных теста C # для существующего приложения SQLite. Каждый тест создает файл базы данных (используя Guid для гарантии уникальности) и выполняет несколько операций с базой данных. Тесты проходят изолированно, но не проходят, если они запускаются один за другим. Второй тест завершается неудачно в момент попытки создать новый SQLiteConnection с «невозможно открыть файл базы данных».

Я подозреваю, что собственные временные файлы SQLite мешают. Вкратце мой вопрос: Могу ли я сделать что-нибудь, чтобы SQLite правильно приводил себя в порядок в конце теста ?

Еще несколько подробностей, на случай, если что-то из этого актуально:

  • Я использую MobileServiceSQLLiteStore
  • Я вижу количество файлов и папок в% TEMP% после завершения первого теста и до того, как второй тест попытается создать файл базы данных:

    1. Файл отчета20180829-1035.diagsession
    2. Папка 39fbfdd5-5f6e-4563-9822-cb153e30e5b6.PackageExtraction
    3. Папка 39FBFDD5-5F6E-4563-9822-CB153E30E5B6.scratch
    4. Папка E41DD259-1CAA-4FEF-A779-003804F6B783
    5. Папка E41DD259-1CAA-4FEF-A779-003804F6B783.scratch
    6. Папка EAFBACB1-B978-419A-98B9-07258EB35C44
    7. Папка EAFBACB1-B978-419A-98B9-07258EB35C44.scratch

      • Все они удаляются в конце теста, кроме 1 и 2 - и остается новый Report.39FBFDD5-5F6E-4563-9822-CB153E30E5B6. При следующем запуске теста все они удаляются, кроме 1.

1 Ответ

0 голосов
/ 29 августа 2018

Наличие временных файлов SQLite представляет собой красную сельдь. Реальная проблема с моим кодом - строка в оболочке MS MobileServiceSQLLiteStore , которую я вызываю:

MobileServiceClient.EnsureFileExists(dbPath);

Это в конечном итоге разрешается до

if (!File.Exists(path)) File.Create(path);

Поскольку этот ответ о переполнении стека указывает, File.Create () оставит файл заблокированным. Поэтому я решил, что файл должен быть пустым, предварительно разблокированный:

if (File.Exists(path)) File.Delete(path);
File.Create(path).Close();
...