集成测试 .NET Core 3 Worker

Joe*_*oel 6 .net c# .net-core .net-core-3.1 asp.net-core-3.1

ASP.NET CoreWebApplicationFactory<T>可用于启动测试主机以进行集成测试。

非 ASP.NET Core 项目是否有等效项?例如,我正在考虑“.NET Core Worker Service Template”。它没有对 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*nco 3

我也遇到过类似的情况,不同之处在于我使用的是 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这个静态类被我的 . 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();
}
Run Code Online (Sandbox Code Playgroud)

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

[TestClass]
public class UnitTest1 : BaseTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var msgConsumer = (IMessageConsumer)base.ServiceProvider.GetService(
            typeof(IMessageConsumer));

        msgConsumer.ConsumeMessage();
    }
}
Run Code Online (Sandbox Code Playgroud)