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

Тестирование базового блока EntityFramework - режим SQLite в памяти и поставщик InMemory

В процессе написания модульных тестов для проекта, использующего EntityFramework Core, и в соответствии с docs, я могу использовать SQLite in-memory mode или The InMemory provider для аппроксимации контекста базы данных.

В документах указано, что SQLite in-memory mode ведет себя как реляционная база данных и что The InMemory provider не всегда ведет себя как реляционная база данных.

Насколько я понимаю, режим SQLite лучше звучит, потому что он ведет себя как реляционная база данных, в то время как провайдер InMemory этого не делает, но я думаю, что есть другие аспекты, которые следует учитывать иначе никто не будет использовать The InMemory provider, который звучит намного хуже.
/" >

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

4b9b3361

Ответ 1

Если ваша единственная цель заключается в написании Unit Tests, внимательно посмотрите на код плиты котла, необходимый для создания тестов, которые могут повлиять на ваши крайние сроки... Я бы выбрал вариант, который заставляет меня вводить меньше кода! (The InMemory provider выглядит проще).

Посмотрите на образцы и решите:

... и, конечно, у вашего проекта будут интеграционные тесты, на тех, с которыми вы будете подключаться к реальной базе данных и выполнять дополнительные проверки. Поэтому для модульных тестов моя главная проблема заключается в написании времени, а не о том, как ведет себя фальшивый DB

Ответ 2

AS для документации Если вы используете InMemory Provider против SQL lite, существует небольшая разница в поведении реляционных данных.

Например, Если есть связанные дочерние записи. Использование LINQ для всех дочерних элементов записи будут загружаться автоматически, что не база данных, где вам нужно включить функцию вызова.

Другим сценарием будет разница между производительностью ввода-вывода при подключении к базе данных в удаленном месте.

Целесообразно включить некоторые реальные тесты, которые не будут поражены в результате реальной производительности и поведения приложений

Ответ 3

По моему опыту (я автор Mig #), каждая платформа базы данных имеет свои собственные небольшие причуды и часто они ведут себя немного разные (например, посмотрите комментарии в атрибутах Supports SQLiteProvider.cs). Даже если все, казалось бы, отвлечено от вас, используя EF, могут быть тонкие различия, дающие вам ложные срабатывания или ложные негативы в ваших тестах.

Поэтому, мое предложение для вас: выполните интеграционное тестирование с реальной платформой базы данных, которую вы хотите поддерживать (даже создание, удаление базы данных SQL Server занимает не так много времени, и есть другие стратегии, как оптимизировать интеграционное тестирование включая базы данных). Для вашей бизнес-логики используйте тестирование дыма без базы данных в фоновом режиме.

Это дает дополнительное преимущество, которое вы планируете структурировать в своем классе, чтобы иметь доступ к базе данных отдельно от бизнес-логики.