集成测试 .NET Core 3 Worker

Posted

技术标签:

【中文标题】集成测试 .NET Core 3 Worker【英文标题】:Integration testing a .NET Core 3 Worker 【发布时间】:2020-07-08 09:04:33 【问题描述】:

ASP.NET Core 具有WebApplicationFactory<T>,可用于启动测试主机以进行集成测试。

非 ASP.NET Core 项目是否有等效项?例如,我正在考虑“.NET Core Worker 服务模板”。它没有对 ASP.NET Core 的任何引用,但它使用通用主机。

例如,我有一个像这样的项目,作为 Windows 服务托管。我想像为 ASP.NET Core 项目一样轻松地为此创建集成测试(我可以重用 Startup 文件中的 DI,因此我不需要在测试中进行设置。

public class Program

    public static void Main(string[] args)
    
        CreateHostBuilder(args).Build().Run();
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) =>
            
                builder.AddAppSettings(context.HostingEnvironment.EnvironmentName);
            )
            .ConfigureServices((hostContext, services) =>
            
                // Loads of configuration (DI, Logging, Messaging, etc) removed for brevity
                // ...
            )
            .UseWindowsService();

在这种情况下,服务会侦听消息(使用 Masstransit),因此没有 HostedService 设置。但在其他情况下也可能存在。

【问题讨论】:

【参考方案1】:

我有类似的情况,不同的是我使用的是 Rabbit MQ 队列。要创建一个使用 .NET CORE windows 服务提取消息的测试,我必须创建单独的项目,在主项目之外,即 windows 服务宿主项目。

在我的例子中,我有一个名为 MessageConsumer 的类,它位于一个具有命名空间 OrdersMessageConsumer.RabbitMQ 的单独项目中,并实现了 IMessageConsumer 接口。

然后,我创建了一个基础测试类(使用 MS Test 项目 .NET CORE 3.1),在其中设置了我的测试使用的主机:

[TestClass]
public abstract class BaseTest

    protected IServiceProvider ServiceProvider  get; set; 

    [TestInitialize]
    public virtual void TestInitialize()
               
        var host = Host.CreateDefaultBuilder(default(string[]))
            .ConfigureAppConfiguration((hostingContext, config) =>
            
                config.AddJsonFile("appsettings.json");
            )
            .ConfigureServices(DependencyRegistrationBuilder.SetUp)
            .Build();

        this.ServiceProvider = host.Services;
    

在这里,为了避免重复依赖解析注册,我创建了另一个不同的项目,其中我有一个名为 DependencyRegistrationBuilder 的静态类,其中包含我所有的依赖解析注册:

public static class DependencyRegistrationBuilder

    public static void SetUp(HostBuilderContext hostContext, IServiceCollection services)
    
        ...
        services.AddSingleton<IMessageConsumer, OrdersMessageConsumer.RabbitMQ.MessageConsumer>();

        ...
    

这个静态类当然也被我的 .NET CORE 3.1 Windows Service 宿主项目使用,如下所示:

public class Program

    public static void Main(string[] args)
    
        CreateHostBuilder(args).Build().Run();
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            
                var env = hostingContext.HostingEnvironment;
                config.AddJsonFile("appsettings.json");
                config.AddJsonFile($"appsettings.env.EnvironmentName.json");
            )
            .ConfigureServices(DependencyRegistrationBuilder.SetUp)
            .UseNLog()
            .UseWindowsService();

最后,在我的测试中,我请求了消息消费者类,然后我调用了它的消费方法,如下所示:

[TestClass]
public class UnitTest1 : BaseTest

    [TestMethod]
    public void TestMethod1()
    
        var msgConsumer = (IMessageConsumer)base.ServiceProvider.GetService(
            typeof(IMessageConsumer));

        msgConsumer.ConsumeMessage();
    

【讨论】:

以上是关于集成测试 .NET Core 3 Worker的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core运行两个TestServer进行集成测试

使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json

不得不说的 ASP.NET Core 集成测试

不得不说的 ASP.NET Core 集成测试

不得不说的 ASP.NET Core 集成测试

学习 ASP.NET Core 2.1:集成测试中使用 WebApplicationFactory