Как инициализировать IServiceScopeFactory в тесте для использования базы данных Entity Framework core InMemory

#c# #.net #.net-core #mstest

#c# #.net #.net-core #mstest

Вопрос:

У меня есть класс HotelRepository, который включает функции crud, я хочу протестировать весь мой репозиторий, используя EF core в базе данных памяти, но я застрял, потому что конструктор класса репозитория принимает IServiceScopeFactory

 Public class HotelRepository
{
    IScopedServiceFactory factory
    public HotelRepository(IScopedServiceFactory factory)
    {
        this.factory = factory;
    }
    public CreateHotel(HotelInformation)
    {
        var context = Create();
        //code to implement save
        context.savechanges();
    }
    
    private HotelDbContext Create()
    {
        return factory.CreateScope().ServiceProvidor.GetRequiredService<Dbcontext>();
    }
}

//using ms tests
public class HotelDb_Tests
{
    public Test_Save_Hotels()
    {
        var options = new DbCOntextOptionsBuilder<DbContext>().UseInMemoryDatabase("TestHotelDb").Options;
        using (var context = new DbContext(Options))
        {
            //How to create instance of HotelRepository which takes IScopedServiceFactory as parameter 
            //Basically want to do the following
            var HotelRepo = new HotelRepo(ScopedServiceFactory);
            HotelRepo.CreateHotel(HotelInformation)
        }
    }
    
}
  

Как я могу инициализировать экземпляр HotelRepository, чем использовать базу данных inmemory для тестирования другой функции

Комментарии:

1.Вы должны предоставить тестовую реализацию. Существуют различные библиотеки, такие как Moq, которые могут помочь : var mockSs = new Mock<IServiceScope>(); mockSs.Setup(m => m.GetRequiredService<DbContext>()).Returns(context); var mockSsf = new Mock<IScopedServiceFactory>(); mockSsf.Setup(m => m.CreateScope()).Returns(mockSs.Object); new HotelRepo(mockSsf.Object) . Я уверен, что это всего лишь пример asp.net доступны основные специальные помощники

2. спасибо @AluanHaddad за ваш вклад. это помогает решить проблему

3. Интересно, могли бы вы упростить задачу, введя функцию фабрики контекста базы данных вместо фабрики области обслуживания. эта функция фабрики базы данных может создать область видимости, абстрагируя эту деталь из репозитория отеля. Конечно, это может не сработать для вашего дизайна, но я думаю, это стоит рассмотреть. Одна из лучших особенностей модульного тестирования заключается в том, что трудно тестируемый код часто приводит к потенциальным изменениям, которые могут принести пользу общему дизайну. Таким образом, ваше репозиторий будет зависеть только от Func<HotelDbContext> .