InMemory и SQLite провайдеры: подводные камни

↑ 4.3 Тестирование слоя данных · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

«Как вы тестируете код с EF?» — ловушка: InMemory выглядит удобно, но обманывает.

Объяснение

ПровайдерСкоростьТранзакцииОграничения и SQLВывод
UseInMemoryDatabaseмаксимальнаянетне проверяет FK, unique, типы; не SQLподходит только для простых демо
SQLite in-memoryвысокаядадиалект ≠ PostgreSQL, нет многих типов/функцийкомпромисс
Реальная БД (Testcontainers)нижедаполное соответствиерекомендуется для интеграционных тестов
// InMemory пропустит то, что в реальной БД упадёт
db.Orders.Add(new Order { CustomerId = Guid.NewGuid() });   // FK на несуществующего клиента
await db.SaveChangesAsync();                                 // ok в InMemory, ошибка в PostgreSQL

Практическое правило: логику unit-тестируйте без БД (fake-репозитории), запросы и схему — на настоящей СУБД.

Нюансы и подводные камни

  • InMemory не поддерживает ExecuteUpdate, сырой SQL, транзакции, xmin, JSON-колонки.
  • В SQLite отличаются DateTimeOffset, decimal, регистр строк, сортировка.
  • Тесты «зелёные» на InMemory могут скрывать баги трансляции LINQ.
  • Команда EF Core прямо не рекомендует InMemory для тестирования.

Практика

  1. Найдите тесты на InMemory и проверьте на реальной БД, какие ошибки они скрывали.
  2. Напишите тест, нарушающий FK/unique, и посмотрите различие.
  3. Переведите тестовую фикстуру на Testcontainers.

Вопросы с ответами

Связанные темы