如何检查ASP.NET Core 3.0的单元测试中是否记录了错误?

问题描述 投票:1回答:2

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

c# moq xunit.net asp.net-core-3.0
2个回答
2
投票

在aspnet github页面上有关于此的an issue。似乎问题出在Moq上,他们已经进行了更改以解决此问题。


0
投票

我使用SGA(设置,抓取,声明)方法。

© www.soinside.com 2019 - 2024. All rights reserved.