Azure blob 中的模拟 FunctionContext 触发 .net 8 中的函数单元测试

问题描述 投票:0回答:1

我需要以下 .net 测试方面的帮助。

我们有针对 blobtrigger 函数的现有单元测试。

我升级到.net 8,FunctionContext 必须代替 ExecutionContext 才能允许使用 RetryContext。 此升级意味着将 Microsoft.Azure.Webjobs 替换为 Microsoft.Azure.Function.Worker 。

上述 blob 触发器执行方法的当前单元测试是创建一个新的 ExecutionContext 对象,并根据测试需要设置 RetryContext.retryCount 和 RetryContext.maxRetryCount。这两个变量用于检查以下条件,

如果 RetryContext.retryCount = RetryContext.maxRetryCount 那么文件需要移动到稍后处理的不同文件夹。

我们的单元测试的编写方式是,所有与 blobtrigger 相关的测试方法(如 fileUpload、executeInvalidFileName 等)都使用这些 retrycontext 属性设置上下文对象,并将上下文传递给执行方法。

FunctionContext 和 Retrycontext 都是抽象类。 RetryContext 是 FunctionContext 的一个属性,并且是一个只读属性。我无法创建对象并作为上下文传递,因为 FunctionContext 是一个抽象类。

我不确定模拟是否是处理此问题的最佳方法,但我尝试模拟函数上下文。

请帮助我修复此问题以通过单元测试的上下文。

我的职能是,

public async Task Run(string blobname, blobcontent, ExecutionContext context)
{
    await this.controller.execute(name,blob,context);
}

我创建的 FunctionContext 模拟:

protected FunctionContext GetExecutionContextNotAtMaxRetry()
{
    var contextMoq = new Mock<FunctionContext>();
    contextMoq.Setup(X => X.RetryContext.RetryCount).Returns(1);
    contextMoq.Setup(X => X.RetryContext.MaxRetryCount).Returns(2);
    return contextMoq;
}

这给了我一个错误,因为 contextMoq 与 FunctionContext 不同。

错误是

Cannot implicitly convert type
Moq.Mock<Microsoft.Azure.Function.Worker.FunctionContext> to
Microsoft.Azure.Function.Worker.FunctionContext.
moq mstest .net-8.0 executioncontext azure-functions-isolated
1个回答
0
投票

如果错误消息(我认为是编译器错误)是

Cannot implicitly convert type
Moq.Mock<Microsoft.Azure.Function.Worker.FunctionContext> to
Microsoft.Azure.Function.Worker.FunctionContext.

然后它会直接告诉你问题所在。

Mock<FunctionContext>
FunctionContext
不是同一类型。然而,方法
GetExecutionContextNotAtMaxRetry
被声明返回类型为
FunctionContext
的对象,但代码返回
Mock<FunctionContext>

尝试更改返回值:

protected FunctionContext GetExecutionContextNotAtMaxRetry()
{
    var contextMoq = new Mock<FunctionContext>();
    contextMoq.Setup(X => X.RetryContext.RetryCount).Returns(1);
    contextMoq.Setup(X => X.RetryContext.MaxRetryCount).Returns(2);
    return contextMoq.Object;
}
© www.soinside.com 2019 - 2024. All rights reserved.