您如何使用 Moq 在 .NET Core 3.1 中对 LoggerMessage.Define() 进行单元测试?
How do you unit test LoggerMessage.Define() in .NET Core 3.1 with Moq?
我正在尝试使用 xUnit 中的 Moq 库对 LoggerMessage.Define() 的某些用法进行单元测试,但无法弄清楚。
下面是我创建的日志记录函数的示例,下面是未能检查它是否被调用的示例单元测试。
LoggerMessage.Define() 示例:
public static class GlobalExceptionLoggerMessage
{
public static Action<ILogger, string, Exception> GlobalException = LoggerMessage.Define<string>(
LogLevel.Error,
new EventId(StatusCodes.Status500InternalServerError, nameof(GlobalException)),
"{Message}");
public static void LogGlobalException(this ILogger logger, string message, Exception exception)
{
GlobalException(logger, message, exception);
}
}
我试过的单元测试示例:
[Fact]
public void LogGlobalExceptionLogTest()
{
var loggerMock = new Mock<ILogger<object>>();
var exception = new Exception("Person must exist.");
const string message = "Person must exist for an object.";
loggerMock.Object.LogGlobalException(message, exception);
loggerMock.Verify(
x => x.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.Is<It.IsAnyType>((v, t) => true),
It.IsAny<Exception>(),
It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)));
}
谁能告诉我如何解决这个问题?
谢谢!
您需要进行一些额外的设置。如果您查看静态 Define
方法,您将看到以下内容:
if (!logger.IsEnabled(logLevel))
return;
Log(logger, arg1, exception);
您尚未在模拟记录器上设置 IsEnabled
,因此它将 return 默认布尔值 (false) 并且不会调用 Log 方法。
以你的样本为例,如果你添加以下内容:
loggerMock.Setup(x => x.IsEnabled(It.IsAny<LogLevel>())).Returns(true);
...您的验证语句开始工作。
我正在尝试使用 xUnit 中的 Moq 库对 LoggerMessage.Define() 的某些用法进行单元测试,但无法弄清楚。 下面是我创建的日志记录函数的示例,下面是未能检查它是否被调用的示例单元测试。
LoggerMessage.Define() 示例:
public static class GlobalExceptionLoggerMessage
{
public static Action<ILogger, string, Exception> GlobalException = LoggerMessage.Define<string>(
LogLevel.Error,
new EventId(StatusCodes.Status500InternalServerError, nameof(GlobalException)),
"{Message}");
public static void LogGlobalException(this ILogger logger, string message, Exception exception)
{
GlobalException(logger, message, exception);
}
}
我试过的单元测试示例:
[Fact]
public void LogGlobalExceptionLogTest()
{
var loggerMock = new Mock<ILogger<object>>();
var exception = new Exception("Person must exist.");
const string message = "Person must exist for an object.";
loggerMock.Object.LogGlobalException(message, exception);
loggerMock.Verify(
x => x.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.Is<It.IsAnyType>((v, t) => true),
It.IsAny<Exception>(),
It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)));
}
谁能告诉我如何解决这个问题?
谢谢!
您需要进行一些额外的设置。如果您查看静态 Define
方法,您将看到以下内容:
if (!logger.IsEnabled(logLevel))
return;
Log(logger, arg1, exception);
您尚未在模拟记录器上设置 IsEnabled
,因此它将 return 默认布尔值 (false) 并且不会调用 Log 方法。
以你的样本为例,如果你添加以下内容:
loggerMock.Setup(x => x.IsEnabled(It.IsAny<LogLevel>())).Returns(true);
...您的验证语句开始工作。