#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>
.