我想验证一些日志记录。我正在使用asp.net核心内置ILogger,并使用asp.net核心内置DI注入(inject)它:

private readonly ILogger<InvoiceApi> _logger;

public InvoiceApi(ILogger<InvoiceApi> logger)
{
    _logger = logger;
}

然后我用它像:_logger.LogError("error));
我试着像往常一样用moq模拟它:
MockLogger = new Mock<ILogger<InvoiceApi>>();

并将其注入(inject)服务以通过以下方式进行测试:
new InvoiceApi(MockLogger.Object);

然后尝试验证:
MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed"))));

但它抛出:



因此,如何验证此日志已记录?

最佳答案

正如@Nkosi已经说过的,您不能模拟扩展方法。您应该 mock 的是the ILogger.Log method,即 LogError calls into。它使验证代码有些笨拙,但应该可以:

MockLogger.Verify(
    m => m.Log(
        LogLevel.Error,
        It.IsAny<EventId>(),
        It.Is<FormattedLogValues>(v => v.ToString().Contains("CreateInvoiceFailed")),
        It.IsAny<Exception>(),
        It.IsAny<Func<object, Exception, string>>()
    )
);

(不确定是否可以编译,但是要点)

10-05 20:13