.NET Core 3 工作器的集成测试

9

ASP.NET Core提供了WebApplicationFactory<T>,可用于启动一个测试主机以进行集成测试。

非ASP.NET Core项目是否也有类似的功能呢?例如,像“.NET Core Worker Service模板”这样的项目没有任何对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个回答

2
我曾经遇到类似的情况,不同之处在于我使用了 Rabbit MQ 队列。为了创建一个测试,从 .NET CORE 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的静态类,其中包含SetUp()方法,该方法包含所有我的依赖解析注册。
public static class DependencyRegistrationBuilder
{
    public static void SetUp(HostBuilderContext hostContext, IServiceCollection services)
    {
        ...
        services.AddSingleton<IMessageConsumer, OrdersMessageConsumer.RabbitMQ.MessageConsumer>();

        ...
    }
}

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

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();
}

最后,在我的测试中,我请求了消息消费者类并调用了其consume方法,如下所示:
[TestClass]
public class UnitTest1 : BaseTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var msgConsumer = (IMessageConsumer)base.ServiceProvider.GetService(
            typeof(IMessageConsumer));

        msgConsumer.ConsumeMessage();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接