Модульный тест .NET 6 с DependencyResolverHelper

Я использовал свои модульные тесты на .Net5 (или ниже) с DependencyResolverHelper, как показано ниже. Это мой базовый тестовый класс

public abstract class BaseTestClass
    {
        protected DependencyResolverHelper _serviceProvider;

        public BaseTestClass()
        {
            var webHost = WebHost.CreateDefaultBuilder()
                .UseStartup<Startup>()
                .Build();

            _serviceProvider = new DependencyResolverHelper(webHost);
        }
    }

и мой DependencyResolverHelper

public class DependencyResolverHelper
    {
        private readonly IWebHost _webHost;

        /// <inheritdoc />
        public DependencyResolverHelper(IWebHost webHost) => _webHost = webHost;


        public T GetService<T>()
        {
            var serviceScope = _webHost.Services.CreateScope();
            var services = serviceScope.ServiceProvider;
            try
            {
                var scopedService = services.GetRequiredService<T>();
                return scopedService;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }

но я немного запутался с новыми вещами зависимости .NET 6. Кто-нибудь пробовал это без класса запуска?

Я попытался изменить его с помощью

WebApplicationBuilder

но это дало Служба для типа MinimalAPI.Services.TokenService.ITokenService не зарегистрирована. ошибка.

Какой смысл всегда создавать новую область видимости? И эти области никогда не утилизируются?

Julian 25.11.2022 07:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто потому, что эта часть кодов .UseStartup<Startup>() вызывает класс запуска и регистрирует службы для вас, если вы попытаетесь использовать WebApplicationBuilder в .net 6, вам придется зарегистрировать службы самостоятельно,

Я пробовал, как показано ниже:

public void Test1()
        {
            var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { });

            builder.Services.AddSingleton<ISomeService,SomeService>();

            var app = builder.Build();

            var serviceProvider = new DependencyResolverHelper(app);

            var someservice = serviceProvider.GetService<ISomeService>();

            Assert.Equal(typeof(SomeService), someservice.GetType());
            
        }

Класс DependencyResolverHelper:

public class DependencyResolverHelper
    {
        private readonly WebApplication _app;

        /// <inheritdoc />
        public DependencyResolverHelper(WebApplication app) => _app = app;


        public T GetService<T>()
        {
            var serviceScope = _app.Services.CreateScope();
            var services = serviceScope.ServiceProvider;
            try
            {
                var scopedService = services.GetRequiredService<T>();
                return scopedService;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }

Результат:

Другие вопросы по теме

Как соединить 2 базы данных внутри одного цикла Foreach для нескольких строк данных без открытия и закрытия соединения каждый раз для каждой строки
Безопасно ли вкладывать асинхронный код внутрь замка, если он вложен в дополнительный кадр стека?
Как вернуть пользовательский код состояния http CoreWCF?
Более одного метода ConvertFromString для типа совместимо с предоставленными аргументами
Какова альтернатива CreateBrokeredMessageReceiver в MassTransit 7 и более поздних версиях?
Диффи-Хеллман: как загрузить генератор и простые значения из файла .pem в .Net
Ошибка API — невозможно загрузить один или несколько запрошенных типов. Метод CommitAsync из сборки JsonApiDotNetCore
Cqrs web api mvc или микросервис
.NET 7: соединение с сервером было успешно установлено, но затем произошла ошибка при входе в систему
Regex Соответствует всем символам после последнего вхождения (и до первого вхождения)