难以模拟logger和验证方法调用



我试图测试我的控制器端点调用LogError一次。下面是测试:

[Fact]
public void Log_error_should_call_logger_error_method()
{
//Arrange
var applicationException = new ApplicationException("This is a mocked exception");
var exceptionHandlerFeatureMock = ErrorsControllerGenerator.GenerateExceptionHandlerFeatureMock(applicationException);
Mock<ILogger<ErrorsController>> iLoggerMock = new Mock<ILogger<ErrorsController>>();
var sut = ErrorsControllerGenerator.GenerateErrorsController(exceptionHandlerFeatureMock, iLoggerMock); 
//Act
sut.LogError("This is a test error");
//Assert
iLoggerMock.Verify(x => x.LogError("This is a test error"), Times.Once());
}

运行测试时,我收到以下错误:

System.NotSupportedException : Invalid verify on a non-virtual (overridable in VB) member: x => x.LogError("This is a test error", new[] {  })

我对此有点困惑,因为从我的理解来看,这不应该发生,因为我嘲笑接口而不是具体的实现?如果我要使用具体的记录器类,我知道该方法必须被标记为virtual才能工作,但我不认为在使用接口时是这种情况。

我已经尝试将这行添加到测试的//Arrange部分:

iLoggerMock.Setup(x => x.LogError(It.IsAny<string>())).Verifiable();

但是这会抛出这个错误:

System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.LogError(It.IsAny<String>(), new[] {  })

这也使我感到困惑,因为模拟对象(ILogger)确实有LogError方法

您不能模拟日志记录器方法,例如LogError,因为不幸的是它们是扩展方法,并且没有在ILogger接口中定义。

与其试图验证是否调用了相关的日志方法,不如验证执行的代码是否采用了预期的路径,即相关日志方法将被调用的路径。

最新更新