.NET Aspire中依赖Postgres的项目如何执行功能单元测试?
.NET Aspire 依赖项目的功能单元测试方案
一、正确使用 DistributedApplicationTestingBuilder 获取服务/资源句柄
你遇到的无法获取被测项目服务句柄的问题,核心是测试代码的构建逻辑有误。只需通过DistributedApplicationTestingBuilder完整复刻Aspire主机的资源配置,并正确关联被测项目即可解决。
步骤1:添加必要的NuGet包
确保测试项目安装以下依赖:
dotnet add package Aspire.Hosting.Testing dotnet add package Aspire.Npgsql.EntityFrameworkCore.PostgreSQL # 匹配Postgres依赖
步骤2:编写测试代码,关联Aspire资源与被测项目
以下是针对依赖Postgres的服务的测试示例:
using Aspire.Hosting.Testing; using Xunit; public class PostgresDependentServiceTests : IAsyncLifetime { private readonly DistributedApplicationTestingBuilder _builder; private DistributedApplicationTestApp _app; public PostgresDependentServiceTests() { // 复刻Aspire主机的资源配置 _builder = DistributedApplicationTestingBuilder.Create(); _builder.AddPostgres("postgresdb") // 与Aspire主机中定义的资源名称保持一致 .WithDatabase("testdb"); // 指定测试专用数据库 // 添加被测项目(如Worker服务或Web API) _builder.AddProject<YourProjectNamespace.Program>("your-service") .WithReference(_builder.GetResource<PostgresResource>("postgresdb")); // 关联Postgres资源 } public async Task InitializeAsync() { // 启动测试应用,Aspire会自动拉起Postgres容器 _app = await _builder.Build().RunAsync(); } [Fact] public async Task TestDatabaseOperation() { // 1. 获取Postgres连接字符串 var connectionString = _app.GetConnectionString("postgresdb"); // 2. 实例化被测服务并注入连接字符串 var service = new YourBusinessService(new NpgsqlDataSource(connectionString)); // 3. 执行测试逻辑,验证数据操作结果 var result = await service.FetchTestData(); Assert.NotNull(result); Assert.NotEmpty(result); } public async Task DisposeAsync() { await _app.DisposeAsync(); } }
二、复用Aspire主机的资源配置(进阶优化)
如果Aspire主机已经定义了完整的资源集合,可以将资源配置抽为独立静态类,让测试项目直接复用,避免重复定义:
在Aspire主机项目中创建资源配置类
public static class AppResourceConfig { public static IResourceBuilder<PostgresResource> AddAppPostgres(this IDistributedApplicationBuilder builder) { return builder.AddPostgres("postgresdb") .WithDatabase("appdb"); } }
在测试项目中复用配置
public PostgresDependentServiceTests() { _builder = DistributedApplicationTestingBuilder.Create(); _builder.AddAppPostgres(); // 直接复用Aspire主机的资源配置 _builder.AddProject<YourProjectNamespace.Program>("your-service") .WithReference(_builder.GetResource<PostgresResource>("postgresdb")); }
三、针对Web API的功能测试
如果被测项目是Web API,可直接获取其端点并发送HTTP请求测试:
[Fact] public async Task TestApiDataEndpoint() { // 获取被测服务的HTTP端点 var apiClient = _app.CreateHttpClient("your-service"); // 发送请求测试API var response = await apiClient.GetFromJsonAsync<List<DataModel>>("/api/data"); Assert.NotEmpty(response); }
关键注意事项
- 测试项目与Aspire主机的资源名称必须一致,否则无法正确关联连接字符串
DistributedApplicationTestingBuilder会自动处理容器的启动与销毁,无需手动管理Docker- 测试前确保Docker处于运行状态,Aspire会自动拉取所需的Postgres镜像
内容的提问来源于stack exchange,提问作者Qrt
相关产品推荐
相关产品推荐

