C#-测试时ILogger的依赖注入

时间:2020-09-01 16:48:26

标签: c# .net-core

我正在使用.Net-Core学习C#。我是依赖注射的新手。我试图了解在测试Blazor Web应用程序中使用的类库时如何注入ILogger<T>

我创建了一个 MotionDetectionConverter 类,该类将ILogger<T>注入构造函数中。

在该类的 Read 方法中,我实例化了另一个帮助器类 JsonVisitor 。如果要向 JsonVisitor 类添加日志记录功能,则可以向构造函数添加ILogger<JsonVisitor>参数。但是,我不明白该如何注入? MotionDetectionConverter Read 方法是否应执行依存性检测?如何进行测试?

MotionDetectionConverter类

    internal sealed class MotionDetectionConverter : JsonConverter<MotionDetection>
    {
        private readonly ILogger _log;

        public MotionDetectionConverter(ILogger<MotionDetectionConverter> logger)
        {
            _log = logger;
        }

        public override bool CanConvert(Type typeToConvert)
        {
            _log.LogInformation("CanConvert {} => {}", typeToConvert.ToString(), (typeToConvert == typeof(MotionDetection)));
            return (typeToConvert == typeof(MotionDetection));
        }

        public override MotionDetection Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            JsonVisitor visitor = new JsonVisitor(ref reader, options);

            Detection details = new Detection();
            details.accept(visitor);

            return details.ToModel();
        }

        public override void Write(Utf8JsonWriter writer, MotionDetection motionDetection, JsonSerializerOptions options) =>
                throw new NotImplementedException("Serialization of MotionDetection objects is not implemented");
    }

JsonVisitor类

internal ref struct JsonVisitor
    {
        // private ILogger _log;
        private Utf8JsonReader _reader;
        private JsonSerializerOptions _options;

        #region Constructor

        public JsonVisitor(ref Utf8JsonReader reader, JsonSerializerOptions options) // ILogger<JsonVisitor> log)
        {
            // _log = log;
            _reader = reader;
            _options = options;
        }
        #endregion

        public void DeserializeMotionInfo(Details target)
        {
            if (_reader.TokenType != JsonTokenType.StartObject)
                throw new NotSupportedException();

            target.plug = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Plug);
            target.name = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Name);
            target.reason = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Reason);
            target.img = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Img);
            target.imgHeight = JSON.ReadIntProperty(ref _reader, MotionInfoPropertyNames.ImgHeight);
            target.imgWidth = JSON.ReadIntProperty(ref _reader, MotionInfoPropertyNames.ImgWidth);
            target.time = JSON.ReadDateTimeOffsetProperty(ref _reader, MotionInfoPropertyNames.Time);

            _reader.Read();
            if (_reader.TokenType != JsonTokenType.EndObject)
                throw new JsonException();

            // _log.LogInformation(string.Format("Completed Read operation for MotionInfo object, token type is now => {0}", reader.TokenType));
        }
}

0 个答案:

没有答案