我正在尝试为持久功能编排中的活动功能编写单元测试。我正在使用 VS 2022 创建的模板。当我尝试模拟 ILogger 时,我收到 SystemNotSupported 异常。
我要测试的功能:
[Function(nameof(MyFunction))]
public static string MyFunction([ActivityTrigger] MyParameters input, FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("MyFunction");
logger.LogInformation("Testing MyFunction...);
return "It worked!";
}
我的测试,我尝试模拟传入的记录器:
[Test]
public async Task MyFunction_ValidParameters_ReturnsValidString()
{
// Arrange
Mock<FunctionContext> funcContextMock = new Mock<FunctionContext>();
funcContextMock.Setup(s => s.GetLogger(It.IsAny<string>()))
.Returns(Mock.Of<ILogger>);
// Act
string blobName = await MyClass.MyFunction(input, funcContextMock.Object);
// Assert
Assert.That(blobName, Is.Not.Null);
Assert.That(blobName, Is.Not.Empty);
Assert.That(blobName, Does.StartWith(input.ExtractName));
}
当我尝试设置 GetLogger() 时,它抛出异常。
我理解异常,但我还没有找到拦截活动函数中使用的记录器的方法。这怎么办?
作为一个附带问题,我看到其他人鼓励依赖注入来对持久功能进行单元测试。有没有办法修改我的代码来做到这一点?在单元测试的 Microsoft 帮助页面中,这些方法的签名与 VS2022 当前生成的签名非常不同。有什么不同? https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-unit-testing
正如我在评论中提到的。
您所关注的文档适用于不使用
CreateReplaySafeLogger
、GetLogger
方法的进程内模型。
我还在隔离模型中创建了一个持久函数,并尝试使用
xUnit
和MOQ
进行测试,我也遇到了相同的错误,但也有消息说这些方法可能无法在设置/验证表达式中使用。
而In-process中没有
CreateReplaySafeLogger
、GetLogger
方法。
我建议您使用进程内模型进行测试。
我认为在隔离模型中不可能直接采用这种方式。
对于解决方法,我建议检查此SO链接