Я хочу создать модульный тест, чтобы убедиться, что метод регистрирует ошибку, используя xUnit и Moq. Этот код работал в ASP.NET Core 2.1:
//Arrange
var logger = new Mock<ILogger<MyMiddleware>>();
var httpContext = new DefaultHttpContext();
var middleware = new MyMiddleware(request => Task.FromResult(httpContext), logger.Object);
//Act
await middleware.InvokeAsync(httpContext);
//Assert
logger.Verify(x => x.Log(LogLevel.Error, It.IsAny<EventId>(), It.IsAny<FormattedLogValues>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()), Times.Once);
Чтобы проверить, что _logger.LogError("Error message");
был вызван в middleware.InvokeAsync
.
Однако в ASP.NET Core 3.0 я не могучтобы убедиться, что регистратор вызывается. На Microsoft.Extensions.Logging.Internal
больше нельзя ссылаться, поэтому FormattedLogValues
недоступен.
Я попытался изменить утверждение, чтобы использовать object
вместо FormattedLogValues
, а также IReadOnlyList<KeyValuePair<string, object>>
, поскольку именно это FormattedLogValues
основан на ( FormattedLogValues.cs ).
Это сообщение об ошибке, которое я получаю в средстве выполнения тестов Visual Studio:
Message:
Moq.MockException :
Expected invocation on the mock once, but was 0 times: x => x.Log<object>(LogLevel.Error, It.IsAny<EventId>(), It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>())
Performed invocations:
ILogger.Log<FormattedLogValues>(LogLevel.Error, 0, Error message, null, Func<FormattedLogValues, Exception, string>)
Stack Trace:
Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage)
Mock`1.Verify(Expression`1 expression, Times times)
Mock`1.Verify(Expression`1 expression, Func`1 times)
MyMiddlewareTests.InvokeAsync_ErrorIsLogged() line 35
--- End of stack trace from previous location where exception was thrown ---
Как проверитьрегистрируется ошибка в ASP.NET Core 3.0?