【问题标题】:Integration testing a .NET Core 3 Worker集成测试 .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 设置。但在其他情况下也可能存在。

【问题讨论】:

    标签: c# .net .net-core asp.net-core-3.1 .net-core-3.1


    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2021-07-05
      • 2020-04-02
      • 2020-08-18
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      相关资源
      最近更新 更多