【问题标题】:How to Mock ILogger / ILoggerService using Moq如何使用 Moq 模拟 ILogger / ILoggerService
【发布时间】:2012-03-20 11:05:13
【问题描述】:

我正在为我的 View Model 类编写一些单元测试。此类的构造函数注入了 ILoggerService。该接口定义了 1 个返回 ILogger 的方法 GetLog。如下所示,this 表示实现 ILoggable 的类:-

protected ViewModelBase(ILoggerService loggerService)
    {
        Logger = loggerService.GetLog(this);
    }

我正在尝试对我的 CreateNewOrder 方法进行单元测试,如下所示:

private void CreateNewOrder(INewOrderViewModel newOrderViewModel)
    {
        Logger.Log("Sending Create New Order Message", LogCategory.Info);
        var createNewOrderMessage = new OrderMessage(newOrderViewModel);
        _eventAggregator.GetEvent<CreateOrderEvent>().Publish(createNewOrderMessage);
    }

我将如何模拟 ILoggerService 以便返回有效的 Logger?目前我的单元测试抛出了 NullReferenceException。

我正在使用 Moq 进行模拟。

我想我需要做一些事情

var loggerService = new Mock<ILoggerService>();
        loggerService.Setup(svc => svc.GetLog(??))

但是如果不让我的测试类实现 ILoggable,我看不到如何。

提前致谢。

【问题讨论】:

  • 如果使用 Serilog,您只需将 Logger.None 传递给您的班级。

标签: c# unit-testing prism moq moq-3


【解决方案1】:

我不确定GetLog 方法参数的类型是什么,但我认为它类似于object,因此记录器服务可以确定请求记录器的类型。您可以使用It 在您正在设置的方法中模拟参数,如下所示。

var logger = new Mock<ILogger>();

var loggerService = new Mock<ILoggerService>();
loggerService.Setup(c => c.GetLog(It.IsAny<object>())
     .Returns(logger.Object);

然后将logger.Object 传递给任何需要ILoggerService 的方法或类型。

【讨论】:

  • 作为参考,我使用类似:var loggerMoq = Mock.Of&lt;ILogger&lt;MyClassName&gt;&gt;();
猜你喜欢
  • 2012-03-18
  • 2010-10-19
  • 2016-09-30
  • 2019-10-06
  • 1970-01-01
  • 2020-10-27
  • 2012-06-01
  • 2018-12-27
  • 2019-06-16
相关资源
最近更新 更多