У меня ограниченный опыт модульного тестирования, поэтому большую часть его изучаю с нуля.
Проект это рабочая служба .NET 8. Я использую xUnit, FakeItEasy и FluentAssertions.
У меня есть объект Factory, который создает конкретные классы на основе переданной строки. Проблема в том, что что для его получения используется метод GetRequiredService, но это не удается, поскольку он пытается использовать поддельные объекты для поставщика услуг. Затем я попытался создать экземпляр поставщика услуг, но затем мне нужно было создать экземпляр того или иного класса, и он превратился в вместо поддельных классов. Затем я пытался добавить в построитель сервисов каждый тип, но затем, когда он выдал ошибку, потому что он не мог использовать объект dbcontext в моем объекте репо, я знал, что сошел с рельсов.
Помогите!
Код модульного теста:
Код: Выделить всё
private readonly IWatchdogWorkerFactory _workerFactory;
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
public WatchdogWorkerFactoryTests()
{
_logger = A.Fake();
_serviceProvider = A.Fake();
//SUT - System Under Test
_workerFactory = new WatchdogWorkerFactory(_serviceProvider, _logger);
}
[Fact]
public void WatchdogWorkerFactory_CreateDataLoadWorker()
{
//Triple A
var dataLoadWorker = A.Fake();
//Arrange - go get variables, classes, functions needed to run test
var services = new ServiceCollection();
// Add IAppState, ILoggerAdapater, and other services
services.AddSingleton();
services.AddSingleton();
// Create the service provider instance
var serviceProvider = services.BuildServiceProvider();
//Act - do some operation
var result = _workerFactory.CreateWorker("dataload");
//Assert - verify result
result.Should().BeSameAs(dataLoadWorker);
}
.....
Ниже находится объект фабрики
Код: Выделить всё
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
[ExcludeFromCodeCoverage]
public WatchdogWorkerFactory(IServiceProvider serviceProvider, ILogger logger)
{
_serviceProvider = serviceProvider;
_logger = logger;
}
public IWatchdogWorker CreateWorker(string watchdogType)
{
switch (watchdogType.ToLower())
{
case "dataload":
return _serviceProvider.GetRequiredService();
case "domoworkbench":
return _serviceProvider.GetRequiredService();
default:
throw new ArgumentException($"Unknown watchdog type: {watchdogType}");
}
}
}
[img]https://i.sstatic.net /emMTuavI.png[/img]
Обновление:
Вот код вызова:
Код: Выделить всё
var worker = _watchdogWorkerFactory.CreateWorker(watchdog.WatchdogType);
var task = Task.Run(() => worker.Process(_taskCancellation, watchdog), stoppingToken);
Код: Выделить всё
public interface IWatchdogWorker
{
Task Process(CancellationToken cancelToken,
WatchdogDTO watchdogItem);
}

Подробнее здесь: https://stackoverflow.com/questions/791 ... pendencies
Мобильная версия