- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家
我正在尝试对我的代码进行单元测试,但是我无法让 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/
创建 ILogger在扩展方法中,我存储了一个 ILoggerFactory在静态类中 public static class ApplicationLogging { public stat
我将我的项目升级到 .NET Core 2.2.x 并收到关于以下代码的过时警告 - 两行: public void Configure(IApplicationBuilder app,
我使用 C# 创建了一个简单的 Azure 函数,我想为其他类库实现 ILoggerFactory。这是我的代码。 MyFunction => Class1 => Class2 namespace F
我想将 Microsoft.Extensions.Logging 与 DryIoc 容器一起使用。 默认方式是将工厂注册为实例,注入(inject)并创建记录器: ILoggerFactory log
我有一个需要无参数构造函数的现有类。我想记录一个错误和其中的一些其他数据。在我的应用程序的其他任何地方,我都将 ILoggerFactory 放在我的构造函数中,DI 会处理它,因此我可以记录等等。由
private ILoggerFactory ConfigureLogging(ILoggerFactory factory) { factory.AddConsole();
我已阅读 this但它适用于 asp.net 核心。我的以下代码适用于非网络 控制台应用程序。 Visual Studio 告诉我 AddConsole(this ILoggerFactory,...
我正在尝试将 NLog 作为提供程序添加到我的 startup.cs 文件中的记录器工厂,但我似乎无法添加它。我见过的所有例子都是这样做的: loggerFactory.AddNLog(new glo
上周将我的 Windows 服务应用程序部署到生产环境失败,所以我尝试在本地以 Release模式运行该项目并得到 InvalidOperationException: Can not determi
在我新的 asp.net 5 应用程序中,我有这个错误: Could not load file or assembly 'Microsoft.Framework.Logging.ILoggerFac
我正在尝试将异常记录到 Application Insights。我通过直接调用 TelemetryClient.TrackException 成功地做到了这一点。但是,我想在我的代码中对此进行抽象,
我正在尝试写入 .netcore/c# 中的自定义事件源,但还没有找到指定 .net core 记录器对象的目标源的方法。在这种情况下,我想写入“我的事件日志”而不是应用程序日志。下面的代码成功写入应
大家 我正在尝试对我的代码进行单元测试,但是我无法让 ILoggerFactory 工作 这是我的单元测试代码(可能不正确): using NUnit.Framework; using Microso
大家 我正在尝试对我的代码进行单元测试,但是我无法让 ILoggerFactory 工作 这是我的单元测试代码(可能不正确): using NUnit.Framework; using Microso
我的 asp.net core 2.x 应用程序有典型的日志记录要求: 在生产中使用应用洞察力, 在开发环境中控制台和调试记录器 根据类别和日志级别设置一些过滤器 现在我看到至少三个不同的 API 来
MS 文档文章 "Introduction to Logging in ASP.NET Core"给出了2个构造函数注入(inject)的例子 使用ILogger private readonly I
这可能与Pass ILogger or ILoggerFactory to constructors in AspNet Core?有点关系,但是这是专门针对库设计的,而不是关于使用这些库的实际应用程
我正在尝试在 Eclipse 项目中使用 log4j.2.x 进行日志记录。我命名为 log4j2.xml 的 conf 文件直接在 java 项目下,我在类路径中有必要的 jars。测试时,我看到以
我使用 asp.net core 1.1 组合了一个简单的控制台应用程序。我设置了 Kestrel 托管并使用了一个 Configure 方法来注入(inject)IApplicationBuilde
我正在处理一个使用简单注入(inject)器作为依赖注入(inject)器的项目。另一方面,该项目使用 Microsoft.Extensions.Logging 来记录某些类中发生的事件。 我的技术问
我是一名优秀的程序员,十分优秀!