I want to verify some logs logged. I am using the asp.net core built-in ILogger, and inject it with the asp.net core built-in DI:
private readonly ILogger<InvoiceApi> _logger; public InvoiceApi(ILogger<InvoiceApi> logger) { _logger = logger; }
then I use it like: _logger.LogError("error));
I tried to mock it (with moq) as usual by:
MockLogger = new Mock<ILogger<InvoiceApi>>();
and inject this in the service for test by:
new InvoiceApi(MockLogger.Object);
then tried verify:
MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed"))));
but it throw:
Invalid verify on a non-virtual (overridable in VB) member: m => m.LogError
So, how can I verify this logs logged?
To mock an ILogger<T> object, we can use Moq library to instantiate a new Mock<ILogger<T>>() object. Make sure you have installed the latest Moq package (v4. 15.1 as of Nov. 16, 2020, which contains an update to support “nested” type matchers).
As @Nkosi've already said, you can't mock an extension method. What you should mock, is the ILogger.Log
method, which LogError
calls into. It makes the verification code a bit clunky, but it should work:
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>>() ) );
(Not sure if this compiles, but you get the gist)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With