持久功能单元测试 - SystemNotSupported 异常

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

我正在尝试为持久功能编排中的活动功能编写单元测试。我正在使用 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

azure mocking azure-durable-functions
1个回答
0
投票

正如我在评论中提到的。

您所关注的文档适用于不使用

CreateReplaySafeLogger
GetLogger
方法的进程内模型。

我还在隔离模型中创建了一个持久函数,并尝试使用

xUnit
MOQ
进行测试,我也遇到了相同的错误,但也有消息说这些方法可能无法在设置/验证表达式中使用。

而In-process中没有

CreateReplaySafeLogger
GetLogger
方法。

我建议您使用进程内模型进行测试。

我认为在隔离模型中不可能直接采用这种方式。

对于解决方法,我建议检查此SO链接

© www.soinside.com 2019 - 2024. All rights reserved.