簡體   English   中英

Serilog ILogger.ForContext 在 XUnit Mock 中拋出 NullReferenceException

[英]Serilog ILogger.ForContext throwing NullReferenceException in XUnit Mock

嘗試使用 Mock 對 signalr 組件進行單元測試時遇到問題。 這是問題發生的地方

 _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);

LogInformation 定義為

logger.ForContext("Component", (object) component, false).ForContext("Class", (object) @class, 
false).ForContext("AppointmentId", (object) appointmentId, false).ForContext("ConfirmationNumber", 
(object) confirmationNumber, false).Information(message);

在 Xunit 單元測試 class 中,它被用作

public Mock<ILogger> MockLogger { get; set; }
MockLogger = new Mock<ILogger>();
Workstation = new Workstation(MockLogger.Object);

運行單元測試時,一旦遇到 _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)"

為了驗證它是否因為 ForContext 而被拋出,使用了這個測試

_logger.Information("a") -> Works
_logger.ForContext("a", "a").Information("a") -> Exception is thrown

這是意料之中的......您正在創建ILogger的模擬,而沒有設置ForContext應該返回的內容,然后嘗試使用ForContext的返回,這顯然是null

您必須在模擬上調用Setup來配置ForContext以返回有效的ILogger

例如

MockLogger.Setup(x => x.ForContext(It.IsAny<string>(), It.IsAny<string>(), false))
    .Returns(MockLogger.Object);

但是,看起來您沒有測試任何有關日志記錄的內容,而只是創建了一個模擬ILogger以滿足正在測試的 class 的依賴性。 在這種情況下,您根本不必創建模擬...您可以簡單地使用Logger.None ,它是一個什么都不做的SilentLogger (它不記錄也不拋出錯誤)。

例如

Workstation = new Workstation(Logger.None);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM