Я написал 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?