【发布时间】:2019-10-08 22:31:26
【问题描述】:
我想创建一个单元测试以确保方法使用 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 不可用。
我尝试将Assert() 更改为使用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 中?
【问题讨论】:
-
为 Log 方法添加 a setup。
标签: c# asp.net-core moq asp.net-core-3.0 xunit.net