我想创建一个单元测试,以确保一种方法正在使用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中是否记录了错误?