如何在Netcore 3.0上模拟ILogger.LogXXX方法

时间:2019-10-08 09:03:24

标签: moq .net-core-3.0 ilogger

直到现在,我们还是通过遵循此approach来嘲笑ILogger.LogXXX调用。

不幸的是,在将项目更新到.net core 3.0之后,如果您使用严格的模拟(Moq),它将始终抱怨没有相应的设置:

Moq.MockException : ILogger.Log<FormattedLogValues>(LogLevel.Information, 0, 
           Inicio de cancelamento de reserva:  Grm.GestaoFrotas.Dtos.Reservas.Mensagens.MsgCancelamentoReserva, 
           null, 
           Func<FormattedLogValues, Exception, string>) invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup.

不幸的是,我不能像这样简单地用FormattedLogValues更改对象:

_container.GetMock<ILogger<GestorReservas>>()
          .Setup(l => l.Log(It.IsAny<LogLevel>(),
                            It.IsAny<EventId>(),
                            It.IsAny<FormattedLogValues>(),
                            It.IsAny<Exception>(),
                            It.IsAny<Func<FormattedLogValues, Exception, string>()));

这是行不通的,因为FormattedLogValues是内部的。

我总是可以更改模拟策略(严格限制),但我希望保持原样(严格)。那么,有关如何解决此问题的任何线索?

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试一下:

//    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
//    <PackageReference Include="Moq" Version="4.13.1" />

container.GetMock<ILogger<GestorReservas>>()
          .Setup(l => l.Log(It.IsAny<LogLevel>(),
                            It.IsAny<EventId>(),
                            It.IsAny<It.IsAnyType>(),
                            It.IsAny<Exception>(),
                            (Func<It.IsAnyType, Exception, string>)It.IsAny<object>())));

https://www.bountysource.com/issues/79804378-cannot-verify-calls-to-ilogger-in-net-core-3-0-preview-8-generic-type-matcher-doesn-t-work-with-verify