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

l

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

简·吉德

在aspnet github页面上一个与此有关的问题。看来问题出在Moq哪里,他们已经进行了更改以解决此问题。

您将需要升级到Moq 4.13以获取修复。

他们引入了,It.IsAnyType以解决内部对象的问题,因此您应该能够更改对的object引用It.IsAnyType并像这样编写测试:

logger.Verify(x => x.Log(LogLevel.Error, It.IsAny<EventId>(), It.IsAny<It.IsAnyType>(), It.IsAny<Exception>(), (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()), Times.Once);

注意:最后一个参数需要进行类型转换,因为Moq当前不支持嵌套类型匹配器。

Moq可以在此处找到更多详细信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 ASP.NET Core 的 ActionExecutingContext 中检查 AllowAnonymousAttribute?

在 asp.net core 中单元测试 UserManager<IdentityUser>

API ASP.NET Core 中的单元测试

如何在ASP.NET Core的X单元单元测试中模拟AutoMapper IConfigurationProvider

如何在 ASP.NET Core 健康检查调用 (MapHealthChecks) 中检查用户代理?

如何在ASP.NET Core中对ViewBag进行单元测试?

如何在ASP.NET Core MVC中对RazorViewEngineOptions进行单元测试?

如何将调试日志记录添加到C#.NET Core单元测试中?

Asp Net core 3的配置是否与Asp Net core 3无关?

ASP.NET Core 3.1 中 API 控制器的单元测试返回错误的状态代码

如何检查用户是否在ASP.NET Core中已通过身份验证

在ASP.NET Core中,如何检查请求是否为本地?

如何检查登录用户是否在 ASP.NET Core 中的角色

如何检查子模型状态是否有效,而不是在asp.net core中检查主模型状态?

如何在3.x中取回ASP.NET Core详细请求记录

如何对ASP.NET Core Web应用程序(.Net Framework)进行单元测试?

Asp.Net Core WebApi:创建单元测试

如何在Asp.net Core MVC(又名Asp.Net 5 RC1)中检查响应cookie?

在单元测试.NET Core Web API中检查ModelState内容

如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?

检查用户是否在ASP.NET Core中登录

ASP Core Identity - 内存中的单元测试错误

Asp.Net Core MVC Web应用程序中的单元测试

ASP.NET Core中的单元测试标签助手-填充标签公共属性

在ASP.NET Core中对自定义密码验证器进行单元测试

模拟ASP.NET Core中的User.Identity以进行单元测试

使用ASP.NET Core在单元测试中模拟POST请求

如何在ASP.NET Core 1.1中对使用HttpContext的MVC控制器进行单元测试

如何在ASP.NET Core中对Web API的动作过滤器属性进行单元测试?