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

.NET 8中Azure Blob触发器单元测试如何模拟FunctionContext?

.NET 8 Azure函数单元测试:修复FunctionContext模拟的类型转换错误及RetryContext配置问题

错误原因

你返回的是Moq的Mock<FunctionContext>对象本身,而非它生成的FunctionContext实例;另外RetryContext是抽象类,不能直接在FunctionContext的Setup中链式配置,需要单独模拟后再关联到FunctionContext上。

修正步骤及代码示例

1. 修正模拟方法,正确生成FunctionContext实例

protected FunctionContext GetExecutionContextNotAtMaxRetry()
{
    // 先模拟RetryContext并配置属性
    var retryContextMock = new Mock<RetryContext>();
    retryContextMock.Setup(r => r.RetryCount).Returns(1);
    retryContextMock.Setup(r => r.MaxRetryCount).Returns(2);

    // 模拟FunctionContext并关联已配置的RetryContext
    var contextMoq = new Mock<FunctionContext>();
    contextMoq.Setup(c => c.RetryContext).Returns(retryContextMock.Object);

    // 返回模拟的FunctionContext实例(而非Mock对象本身)
    return contextMoq.Object;
}

2. 修正函数代码的参数类型

升级到Microsoft.Azure.Function.Worker后,函数参数需从ExecutionContext改为FunctionContext,否则无法匹配新的上下文类型:

// 修正后的函数签名
public async Task Run(string blobname, Stream blobcontent, FunctionContext context)
{
    await this.controller.execute(blobname, blobcontent, context);
}

测试调用示例

在单元测试中直接调用修正后的模拟方法获取上下文即可:

[Fact]
public async Task Test_FileMove_NotAtMaxRetry()
{
    var functionContext = GetExecutionContextNotAtMaxRetry();
    // 调用函数逻辑并执行断言
    await yourFunction.Run("test-blob", new MemoryStream(), functionContext);
    // ... 后续断言代码
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:06