访问 Aspire 测试中的资源

本文介绍如何在测试中从 Aspire AppHost 访问资源。 AppHost 表示完整的应用程序环境,并包含可供应用程序使用的所有资源。 编写功能测试或集成测试 Aspire时,可能需要访问这些资源来验证应用程序的行为。

访问 HTTP 资源

若要访问 HTTP 资源,请使用 HttpClient 来请求和接收响应。 这DistributedApplicationDistributedApplicationFactory两者都提供一个CreateHttpClient方法,该方法用于根据 AppHost 中的资源名称为特定资源创建HttpClient实例。 此方法还采用可选的 endpointName 参数,因此,如果资源有多个终结点,则可以指定要使用的终结点。

访问其他资源

在测试中,你可能希望通过它们提供的连接信息来访问其他资源,例如,查询数据库以验证数据的状态。 为此,请使用 ConfigurationExtensions.GetConnectionString 方法检索资源的连接字符串,然后将该连接字符串提供给测试中的客户端库以与资源交互。

确保资源可用

从 Aspire 9 开始,支持等待依赖资源可用(通过 健康检查 机制)。 这在测试中非常有用,在尝试访问资源之前确保资源可用。 ResourceNotificationService 类提供了一个 ResourceNotificationService.WaitForResourceAsync 方法,用于等待命名资源可用。 此方法采用资源名称和所需的资源状态作为参数,并返回一个在资源可用时返回的 Task。 可按以下示例所示访问 ResourceNotificationService 该通道 DistributedApplication.ResourceNotifications

注意

建议在等待资源时提供超时,以防止测试在资源永不可用的情况下无限期挂起。

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
await app.ResourceNotifications.WaitForResourceAsync(
    "webfrontend",  
    KnownResourceStates.Running,
    cts.Token); 

资源在开始执行时立即进入 KnownResourceStates.Running 状态,但这并不意味着它已准备好处理请求。 如果要等待资源准备好处理请求,并且资源具有运行状况检查,则可以使用 ResourceNotificationService.WaitForResourceHealthyAsync 该方法等待资源正常运行。

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

await app.ResourceNotifications.WaitForResourceHealthyAsync(
    "webfrontend",
    cts.Token);

此资源通知模式可确保资源在运行测试之前可用,避免由于资源未就绪而导致测试失败的潜在问题。

另请参阅