gpt4 book ai didi

c# - 集成测试 .NET Core 3 Worker

转载 作者:行者123 更新时间:2023-12-03 14:53:54 26 4
gpt4 key购买 nike

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设置。但在其他情况下也可能存在。

最佳答案

我有类似的情况,不同的是我使用的是 Rabbit MQ 队列。要创建一个使用 .NET CORE windows 服务提取消息的测试,我必须创建单独的项目,出主 ,即windows服务宿主项目。
在我的例子中,我有一个名为 MessageConsumer 的类,它位于一个带有命名空间 OrdersMessageConsumer.RabbitMQ 并实现 IMessageConsumer 接口(interface)的单独项目中。
然后,我创建了一个基础测试类(使用 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();
}
最后,从我的测试中,我请求了消息消费者类,然后我调用了它的消费方法,如下所示:
[TestClass]
public class UnitTest1 : BaseTest
{
[TestMethod]
public void TestMethod1()
{
var msgConsumer = (IMessageConsumer)base.ServiceProvider.GetService(
typeof(IMessageConsumer));

msgConsumer.ConsumeMessage();
}
}

关于c# - 集成测试 .NET Core 3 Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60889150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com