c# unit-testing logging asp.net-core moq

c# - Cómo probar el Ilogger incorporado en el núcleo asp.net



unit-testing logging (3)

LogError es un método de extensión (estático), no un método de instancia. No se puede "burlar" directamente los métodos estáticos (por lo tanto, el método de extensión) con un marco de burla, por lo que Moq no puede simular y, por lo tanto, verificar ese método. He visto sugerencias en línea sobre la adaptación / envoltura de la interfaz de destino y hacer sus burlas sobre eso, pero eso significaría reescribir si ha utilizado el ILogger predeterminado en todo el código en muchos lugares. Tendría que crear 2 nuevos tipos, uno para la clase contenedora y el otro para la interfaz simulable.

Quiero verificar algunos registros registrados. Estoy utilizando el núcleo incorporado asp.net ILogger, e inyectándolo con el núcleo integrado asp.net DI:

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

luego lo uso como: _logger.LogError("error));

Traté de burlarme (con moq) como de costumbre:

MockLogger = new Mock<ILogger<InvoiceApi>>();

e inyectar esto en el servicio para la prueba por:

new InvoiceApi(MockLogger.Object);

luego intenté verificar:

MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed"))));

pero tira:

Verificación no válida en un miembro no virtual (anulable en VB): m => m.LogError

Entonces, ¿cómo puedo verificar estos registros registrados?


Como ya dijo @ Nkosi''ve, no puedes burlarte de un método de extensión. Lo que debería burlarse, es el método ILogger.Log , al cual llama LogError . Hace que el código de verificación sea un poco torpe, pero debería funcionar:

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>>() ) );

(No estoy seguro de si esto compila, pero entiendes la esencia)