Тестирование IDbCommandInterceptor с InMemoryDatabase для EFCore - PullRequest
0 голосов
/ 04 марта 2020

Я написал IDbCommandInterceptor для перехвата вызовов EntityFrameworkCore DbContext. Теперь я хотел бы написать модульные тесты для перехватчика. Я могу перехватить и запустить пользовательские логи c для фактического дБ (протестировано с SqlServer и MySql), однако при тестировании с InMemoryDatabase (предоставляется. Net для тестирования ), мои методы перехватчика никогда не вызываются.

Вот как я настраиваю свой модульный тест:

TestDbContext класс:

    public class TestDbContext : DbContext
    {
        public TestDbContext(DbContextOptions options) : base(options) { }

        public DbSet<User> Users { get; set; }

    }

    public class User
    {
        public int UserId { get; set; }
    }

Вот как я Я инициализирую контекст в моем тесте:

        private TestDbContext GetTestDbContext()
        {
            var options = new DbContextOptionsBuilder<TestDbContext>()
                .UseInMemoryDatabase(databaseName: "TestDB")
                .AddInterceptors(new MyInterceptor())
                .Options;
            var context = new TestDbContext(options);

            // Seed data
            context.Users.Add(new User { UserId = 1 });
            context.Users.Add(new User { UserId = 2 });
            context.Users.Add(new User { UserId = 3 });
            context.SaveChanges();

            return context;
        }

Теперь, когда я вызываю SaveChanges() или выполняю запрос по этому контексту, я ожидаю, что он вызовет переопределенный метод MyInterceptor моего *1017* так же, как это происходит, когда я использую фактическую базу

Я что-то упустил? Или DbCommandInterceptor не работает с InMemoryDatabase?

1 Ответ

0 голосов
/ 04 марта 2020

Поставщик InMemory не является реляционным поставщиком и поэтому не реализует перехватчики DbCommand. Для этого вида тестирования вы можете использовать базу данных SQL Server / SQL Server LocalDb / SQlite.

...