Spa*_*117 2 mocking xunit signalr-hub serilog asp.net-core-signalr
尝试使用 Mock 对信号器组件进行单元测试时遇到问题。这是问题发生的地方
_logger.LogInformation($"Registering a Station with id: {Id}" +
$" with status: {Status}" +
$"{(!string.IsNullOrEmpty(CommandId) ? $", with command: {CommandId}" : "")}",
LoggingConstants.Component.MessageHub,
LoggingConstants.Class.Workstation,
!string.IsNullOrEmpty(AppointmentId) ?
AppointmentId : LoggingConstants.NoAppointmentId,
LoggingConstants.NoConfirmationNumber);
Run Code Online (Sandbox Code Playgroud)
LogInformation 定义为
logger.ForContext("Component", (object) component, false).ForContext("Class", (object) @class,
false).ForContext("AppointmentId", (object) appointmentId, false).ForContext("ConfirmationNumber",
(object) confirmationNumber, false).Information(message);
Run Code Online (Sandbox Code Playgroud)
在 Xunit 单元测试类中,它被用作
public Mock<ILogger> MockLogger { get; set; }
MockLogger = new Mock<ILogger>();
Workstation = new Workstation(MockLogger.Object);
Run Code Online (Sandbox Code Playgroud)
当单元测试运行时,一旦它遇到 _logger.LogInformation() 消息,它就会抛出一个
"System.NullReferenceException : Object reference not set to an instance of an object.
at LogInformation(ILogger logger, String message, String component, String class, String
appointmentId, String confirmationNumber)"
Run Code Online (Sandbox Code Playgroud)
为了验证它是否因为 ForContext 被抛出,使用了这个测试
_logger.Information("a") -> Works
_logger.ForContext("a", "a").Information("a") -> Exception is thrown
Run Code Online (Sandbox Code Playgroud)
这是预期的......您正在创建一个模拟而ILogger没有设置ForContext应该返回的内容,然后尝试使用它的返回ForContext显然是null.
您必须调用Setup您的模拟来配置ForContext以返回有效的ILogger.
例如
MockLogger.Setup(x => x.ForContext(It.IsAny<string>(), It.IsAny<string>(), false))
.Returns(MockLogger.Object);
Run Code Online (Sandbox Code Playgroud)
但是,看起来您没有测试任何有关日志记录的内容,只是创建了一个模拟ILogger来满足被测试类的依赖关系。在这种情况下,您根本不必创建模拟......您可以简单地使用Logger.Nonewhich is aSilentLogger什么都不做(它不记录也不抛出错误)。
例如
Workstation = new Workstation(Logger.None);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |