Тестирование основных миграций Entity Framework - PullRequest
0 голосов
/ 25 сентября 2019

Как использовать модульное / интеграционное тестирование, чтобы убедиться, что миграция с первым кодом правильно работает в заполненной базе данных предыдущих версий, включая любой дополнительный код для сопоставления данных из одного столбца или таблицы в другой?

Я нашел несколько предыдущих ответов, которые использовали классы в пространстве имен System.Data.Entity, но, похоже, они устарели с Entity Framework Core, и ручное управление миграциями невозможно?

Я нашел для себя решение, которое я будупост, но я приветствую другие, лучшие решения.

1 Ответ

0 голосов
/ 25 сентября 2019

База данных определяется классом Context и классом ContextModelSnapshot, серией файлов миграции и объектами C #, которые хранятся в таблицах данных.

Если вы еще не создали миграцию, скопируйте всеиз этих файлов в ваш тестовый проект и переименуйте все классы с суффиксом, например, «MyDataEntity» => «MyDataEntityVersion1».Отредактируйте связанные файлы .Design.cs соответственно.После этого создайте новую миграцию на исходной.

Если вы создали новую миграцию, но не можете вернуться назад, вы можете вручную отредактировать файл ContextModelSnapshot, чтобы отменить изменения.

Ключк этой работе относится то, что оба указывают на один и тот же файл базы данных.Один ожидает исходного состояния, а другой ожидает обновленного состояния.

В вашем тестовом примере вы можете выполнить:

[TestInitialize]
public void TestInit()
{
    using (var db = new MyDataContext())
        db.Database.EnsureDeleted(); // reset database before each test
}

[TestMethod]
public void Migrate_Version1_To_Version2_On_Populated_Database()
{
    using (var db = new MyDataContextVersion1())
        db.Database.Migrate(); // create database and apply migrations up through Version 1

    // populate the Version 1 database

    App.InitializeDatabase(); // whatever method you would normally call to read/update the database

    // assert statements to test that the Version 2 database looks like you expect.
}

, где InitializeDatabase() выглядит примерно так:

public void InitializeDatabase()
{
    using (var db = new MyDataContext())
    {
        db.Database.Migrate();

        // detect if upgrade needed and set new columns

        db.SaveChanges(); 
    }
}

Обратите внимание, что это решение частично мотивировано использованием SQLite, который не поддерживает удаление столбцов в процессе миграции.Это отговорило меня от попыток сделать что-то более причудливое в миграциях.

...