unit-testing - 如何使用 Moq 模拟 Microsoft.Extensions.Logging

标签 unit-testing logging .net-core mocking moq

我目前正在尝试使以下代码在运行时成功:

public delegate void LogDelegate(LogLevel logLevel, EventId eventId, object state, Exception exception, Func<object, Exception, string> formatter);

public abstract class LoggingTestBase
{
    private Mock<ILogger> _mockLogger;

    public ILogger Setup(LogDelegate logCallback)
    {
        _mockLogger = new Mock<ILogger>(MockBehavior.Strict);
        _mockLogger.Setup(logger => logger.Log(
                It.IsAny<LogLevel>(),
                It.IsAny<EventId>(),
                It.IsAny<object>(),
                It.IsAny<Exception>(),
                It.IsAny<Func<object, Exception, string>>()))
            .Callback(logCallback);
        return _mockLogger.Object;
    }
}

问题是,我得到了一个 MockException一旦我运行测试,因为被调用的方法是通用的 ILogger.Log<FormattedLogValues>(...)我显然没有设置。

阅读existing answer to this和 Moq 文档我得出的结论是,我可能应该使用正确的类型参数模拟泛型方法,如上所示。

在这里,我偶然发现了下一个问题,这使我结束了想法:

Microsoft.Extensions.Logging 的当前版本中FormattedLogValues不再是公开的而是内部的(在 this PR 之后),这使得模拟最终被调用的泛型方法变得不可能。

有没有人成功解决过这个问题?
如何?

最佳答案

我有一个类似的问题。我只想验证是否调用了对 LogInformation 的调用。据此 -> https://github.com/aspnet/Extensions/issues/1319它可能应该由最小起订量解决..

但是,最后有一个建议,您可以使用 It.IsAnyType 而不是 object.. 对您来说,这将类似于:

_mockLogger.Setup(logger => logger.Log(
            It.IsAny<LogLevel>(),
            It.IsAny<EventId>(),
            It.IsAny<It.IsAnyType>(),
            It.IsAny<Exception>(),
            (Func<It.IsAnyType, Exception, string>) It.IsAny<object>()))
        .Callback(logCallback);

我无法让它发挥作用,但也许这会将您推向正确的方向?

关于unit-testing - 如何使用 Moq 模拟 Microsoft.Extensions.Logging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55198845/

相关文章:

c# - 设置 X509Certificate2 PrivateKey 时出错

c# - dotnet core autofac 和 json 配置它们可以在控制台应用程序中一起工作吗

visual-studio-code - Visual Studio代码:找不到preLaunchTask'build'?

c# - 主菜单中缺少 Visual Studio TEST

javascript - 从堆栈跟踪中获取文件名

java - 安卓;使用执行("bugreport")

java - 使用Java读取SQLCMD的输出文件

java - 更改日志语言 Spring Boot

Ruby Test :Unit, 如何知道测试套件中每个测试用例的失败/通过状态?

unit-testing - 测试使用全局事件总线的 Vue 单文件组件