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

如何自托管.NET 7隔离工作者Azure函数以测试函数及中间件?

自托管.NET 7隔离工作者函数并测试中间件的实现方案

前置准备

确保测试项目安装以下NuGet包:

  • Microsoft.Azure.Functions.Worker
  • Microsoft.Azure.Functions.Worker.Testing
  • xunit
  • xunit.runner.visualstudio
  • 可选:FluentAssertions(简化断言逻辑)

步骤1:配置自托管测试主机

使用FunctionWorkerApplicationFactory搭建模拟的函数运行环境,同时注册你的中间件和目标函数:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Testing;
using Xunit;

public class WorkerFunctionMiddlewareTests
{
    private readonly FunctionWorkerApplicationFactory _factory;

    public WorkerFunctionMiddlewareTests()
    {
        _factory = new FunctionWorkerApplicationFactory(builder =>
        {
            // 注册自定义中间件
            builder.UseMiddleware<StampHttpHeaderMiddleware>();
            // 注册待测试的函数类
            builder.Services.AddScoped<SampleHttpFunction>();
        });
    }

    [Fact]
    public async Task HttpFunction_WithMiddleware_ShouldApplyHeader()
    {
        // 创建测试客户端
        var client = _factory.CreateClient();

        // 模拟发送HTTP请求到目标函数
        var response = await client.GetAsync("/api/SampleHttpFunction");

        // 验证中间件效果:检查响应头是否符合预期
        response.Headers.Should().ContainKey("X-Stamp-Header"); // 基于FluentAssertions的断言
        // 原生xunit断言写法:Assert.True(response.Headers.Contains("X-Stamp-Header"));
    }
}

步骤2:补充中间件与测试函数实现

假设你的StampHttpHeaderMiddleware用于给HTTP响应添加自定义头,完整实现示例:

internal sealed class StampHttpHeaderMiddleware : IFunctionsWorkerMiddleware
{
    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
        // 先执行后续中间件/函数逻辑
        await next(context);

        // 针对HTTP触发器响应添加自定义头
        if (context.GetHttpResponseData() is { } response)
        {
            response.Headers.Add("X-Stamp-Header", DateTime.UtcNow.ToString("o"));
        }
    }
}

对应的测试用HTTP函数示例:

public class SampleHttpFunction
{
    [Function("SampleHttpFunction")]
    public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req, FunctionContext context)
    {
        var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
        response.WriteString("Hello from isolated worker function!");
        return response;
    }
}

关键说明

  • FunctionWorkerApplicationFactory会模拟真实的函数运行时,自动处理触发器绑定、中间件管道执行逻辑
  • 测试客户端可直接通过路由调用函数,和生产环境调用方式一致
  • 可通过FunctionContext获取请求/响应上下文,验证中间件在执行前/后对上下文的修改行为

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:52:13