我需要以下 .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.
如果错误消息(我认为是编译器错误)是
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;
}