我想验证一些日志记录。我正在使用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>>()
)
);
(不确定是否可以编译,但是要点)