c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试

标签 c# testing .net-core integration-testing

存储库可在此处获得:https://github.com/ranouf/TestingWithDotNetCore3_0/tree/WithDatabase

我正在寻找一种方法将我的集成测试从 .Net Core 2.0 升级到 3.0。 我真的尽了最大努力来注入(inject)一个该死的服务,正如你所看到的,我尽我所能:

        var hostBuilder = new HostBuilder()
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.AddXunit(Output);
            })
            .ConfigureServices(services =>
            {
                services.AddAutofac();
                services.AddSingleton<IMyService, MyService>(); //Here
            })
            .ConfigureContainer<ContainerBuilder>(builder =>
            {
                builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();//Here
            })
            .ConfigureWebHost(webHost =>
            {
                // Add TestServer
                webHost
                    .UseStartup<TestStartup>()
                    .UseTestServer()
                    .ConfigureServices(services =>
                    {
                        services.AddSingleton<IMyService, MyService>();//Here
                        services.AddAutofac();
                        services
                            .AddControllers()
                            .AddApplicationPart(typeof(TestStartup).Assembly);
                    })
                    .ConfigureTestServices(services =>
                    {
                        services.AddSingleton<IMyService, MyService>();//Here
                        services.AddAutofac();
                        services
                            .AddControllers()
                            .AddApplicationPart(typeof(TestStartup).Assembly);
                    })
                    .ConfigureTestContainer<ContainerBuilder>(builder =>
                    {
                        builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();//Here
                    });
            });

但是你猜怎么着?它根本不起作用......我真的不知道如何让 HostBuilder 理解...... 当然,我尝试过只保留一种方式来注入(inject)我的服务

所以当我想获得服务时:

    Host = hostBuilder.Start();
        Server = Host.GetTestServer();
        Client = Host.GetTestClient();

        using (var scope = Host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var myService = services.GetRequiredService<MyService>();
            }
            catch (Exception ex)
            {
                Output.WriteLine("HOST: " + ex.Message);
            }
        }
        using (var scope = Server.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var myService = services.GetRequiredService<MyService>();
            }
            catch (Exception ex)
            {
                Output.WriteLine("SERVER: " + ex.Message);
            }
        }

错误信息是:

The requested service 'MyAPI.Services.MyService' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

如何在 HostBuilder 中成功注入(inject)服务?

最佳答案

您已经注册,每当有人请求 IMyService 时,都会给他们一个 MyService 的实例 - 但您直接请求 MyService 而 DI 没有对此一无所知。

您需要将注册更改为:

builder.RegisterType<MyService>().InstancePerLifetimeScope();

或者要求接口(interface)而不是类:

services.GetRequiredService<IMyService>();

另外,你只需要在ConfigureContainer方法中注册即可。

关于c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59275542/

相关文章:

c# - 从远程 SQL Server 获取备份

testing - 如果我没有可用的服务,如何使用提交来测试 XForms?

.net-core - 为什么微软将 AppDomain 带回 .NET Core 3.0?

.net-core - EF Core 3.1.4 导航属性在一对一关系中返回 null

.net-core - NuGet:使用 .NET Framework 而不是 net5.0 恢复了包

c# - 如何在一个案例中处理多个值?

c# - 捕获控制台退出 C#

c# - 在应用程序首次启动时显示其他 View

firefox - Selenium 无法单击固定页脚下的复选框

java - JUnit 测试具有多个(不同)参数的预期异常