c# - C# 中使用 ILogger 进行单元测试静态方法 ILoggerFactory 为 Null

标签 c# unit-testing botframework ilogger

大家

我正在尝试对我的代码进行单元测试,但是我无法让 ILoggerFactory 工作

这是我的单元测试代码(可能不正确):

using NUnit.Framework;
using Microsoft.Extensions.Logging;
using System.Reflection;
using Moq;
using System;
using MyProgramVIP.Bots.Presenter;
using MyProgramVIP.Bots.Model;
using MyProgramVIP.Bots.Utils;

namespace MyProgramVIPTest
{
    public class TestsExample
    {
        [SetUp]
        public void Setup() {
            
        }

        [Test]
        public void TestExample1()
        {
            //Mocks
            var mockLogger = new Mock<ILogger<TicketPresenter>>();
            mockLogger.Setup(
                m => m.Log(
                    LogLevel.Information,
                    It.IsAny<EventId>(),
                    It.IsAny<object>(),
                    It.IsAny<Exception>(),
                    It.IsAny<Func<object, Exception, string>>()));

            var mockLoggerFactory = new Mock<ILoggerFactory>();
            mockLoggerFactory.Setup(x => x.CreateLogger(It.IsAny<string>())).Returns(() => mockLogger.Object);

            //Construción del modelo necesario para la prueba
            ConversationData conversationData = new ConversationData();
            conversationData.ticket = new Ticket();
            conversationData.response = new Response();

            //Invocación del método a probar
            TicketPresenter.getPutTicketMessage(conversationData);

            //Comprobación del funcionamineto
            Assert.AreEqual("ticketType", conversationData.response.cardIdResponse);
        }
    }
}

这是我要测试的类的代码(我只留下了失败的代码行)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using MyProgramVIP.Bots.Interactor.Services;
using MyProgramVIP.Bots.Model;
using MyProgramVIP.Bots.Utils;

namespace MyProgramVIP.Bots.Presenter
{
    public class TicketPresenter
    {
        private static ILogger _logger = UtilsVIP.ApplicationLogging.CreateLogger(MethodBase.GetCurrentMethod().DeclaringType.Name);

        /// <summary>
        /// Función getPutTicketMessage: encargada de comenzar con el flujo de poner un ticket.
        /// </summary>
        /// <param name="conversationData"></param>
        public static void getPutTicketMessage(ConversationData conversationData)
        {
            try
            {
                //Here it crash.
                _logger.LogInformation("INIT getPutTicketMessage");

                //Code..........

                //Never gets here.
                _logger.LogInformation("ENDED getPutTicketMessage");
            }
            catch (Exception ex)
            {
                //Here it crash too.
                _logger.LogError("EXCEPTION getPutTicketMessage" + ex.ToString());
            }
        }
}

这是错误所在的帮助类的代码:

using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using MyProgramVIP.Bots.Model;
using MyProgramVIP.Bots.Model.Elements;

namespace MyProgramVIP.Bots.Utils
{
    public class UtilsVIP
    {
        private static ILogger _logger = ApplicationLogging.CreateLogger("ILogger");

        //Other funtions...

        public static class ApplicationLogging
        {
            public static ILoggerFactory LoggerFactory { get; set; }
            public static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>();
            //Here LoggerFactory is null.
            public static ILogger CreateLogger(string categoryName) => LoggerFactory.CreateLogger("VIPLog: " + categoryName);

        }

        //Other funtions...
    }
}

就在它运行的行上:

LoggerFactory.CreateLogger("VIPLog: " + categoryName);

LoggerFactory 为空。

我在互联网上做了很多研究,但这一切都导致了非静态类信息。

如果它很重要,它是一个 Botframework 项目。

如有任何帮助,我们将不胜感激。

提前致谢。

最佳答案

非常感谢@ChetanRanpariya 的评论,我的问题的答案非常简单:

using NUnit.Framework;
using Microsoft.Extensions.Logging;
using System.Reflection;
using Moq;
using System;
using MyProgramVIP.Bots.Presenter;
using MyProgramVIP.Bots.Model;
using MyProgramVIP.Bots.Utils;

namespace MyProgramVIPTest
{
    public class TestsExample
    {
        [SetUp]
        public void Setup() {
            
        }

        [Test]
        public void TestExample1()
        {
            //Mocks
            var mockLogger = new Mock<ILogger<TicketPresenter>>();
            mockLogger.Setup(
                m => m.Log(
                    LogLevel.Information,
                    It.IsAny<EventId>(),
                    It.IsAny<object>(),
                    It.IsAny<Exception>(),
                    It.IsAny<Func<object, Exception, string>>()));

            var mockLoggerFactory = new Mock<ILoggerFactory>();
            mockLoggerFactory.Setup(x => x.CreateLogger(It.IsAny<string>())).Returns(() => mockLogger.Object);

            //Just add this, I guess is replacing the objet with the mock.
            UtilsVIP.ApplicationLogging.LoggerFactory = mockLoggerFactory.Object;
            
            //Construción del modelo necesario para la prueba
            ConversationData conversationData = new ConversationData();
            conversationData.ticket = new Ticket();
            conversationData.response = new Response();

            //Invocación del método a probar
            TicketPresenter.getPutTicketMessage(conversationData);

            //Comprobación del funcionamineto
            Assert.AreEqual("ticketType", conversationData.response.cardIdResponse);
        }
    }
}

只需添加以下内容:

UtilsVIP.ApplicationLogging.LoggerFactory = mockLoggerFactory.Object;

感谢您的帮助。

关于c# - C# 中使用 ILogger 进行单元测试静态方法 ILoggerFactory 为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63574805/

相关文章:

node.js - Teams Bot 开发中的对话概念

c# - 有没有办法通过检索 MySqlDataReader boolean 值在 Visual Studio C# 中打开/关闭复选框?

c# - 如何访问我保存为资源的批处理文件?

html - 自动化视觉布局测试

C# Microsoft Bot Framework 与 luis 结果指向 QNA Maker 和图形 api

c# - 在 Bot Framework 中使用 FormFlow 对话框

c# - 如何在 WP7 中的枢轴页面上应用加速度计来导航页面?

c# - 如何命名 c# 类字段以便能够反序列化具有无效字符的 json 字段名称

java - 在 MockMvcResultHandlers 中找不到 get() 方法

angularjs - 如何在 jasmine 中对条件语句进行单元测试