如何使用Moq模拟ILogger/ILoggerService

本文关键字:ILoggerService ILogger 模拟 何使用 Moq | 更新日期: 2023-09-27 18:28:17

我正在为视图模型类编写一些单元测试。此类的构造函数注入了ILoggerService。此接口定义了一个返回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?目前,我的单元测试抛出了一个NullReferenceExeception。

我在用Moq做我的嘲讽。

我想我需要做一些类似的事情

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

但如果不让我的测试类实现ILoggable,我就看不出该怎么办。

提前谢谢。

如何使用Moq模拟ILogger/ILoggerService

我不确定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的方法或类型。