You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:50:13