Xunit 验证在模拟记录器中不起作用

问题描述 投票:0回答:1

我有以下代码,

namespace MarketData.Service.Diagnostics
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using Microsoft.Extensions.Logging;

    public class MarketsDataUploader
    {
        private readonly ILogger<MarketDataService> logger;

        private readonly Func<IDbConnection> connectionFactory;

        public MarketsDataUploader(ILogger<MarketDataService> logger, Func<IDbConnection> connectionFactory)
        {
            this.logger = logger;
            this.connectionFactory = connectionFactory;
        }

        public void WriteData(IEnumerable<MarketData> marketData)
        {
            try
            {
                using var connection = this.connectionFactory.Invoke();
                connection.Open();

                foreach (var item in marketData)
                {
                    using var command = connection.CreateCommand();

                    command.CommandText =
                        "INSERT INTO MarketData (SchemeId, AnalysisDate, CreatedDate, Duration, [Value], Status) " +
                        "VALUES (@SchemeId, @AnalysisDate, @CreatedDate, @Duration, @Value, @Status)";

                    command.Parameters.Add(CreateParameter(command, "@SchemeId", item.SchemeId));
                    command.Parameters.Add(CreateParameter(command, "@AnalysisDate", item.AnalysisDate));
                    command.Parameters.Add(CreateParameter(command, "@CreatedDate", item.CreatedDate));
                    command.Parameters.Add(CreateParameter(command, "@Duration", item.Duration));
                    command.Parameters.Add(CreateParameter(command, "@Value", item.Value));
                    command.Parameters.Add(CreateParameter(command, "@Status", modelRunStatistic.Status));
                    command.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, ex.Message);
            }
        }
        
        private static IDbDataParameter CreateParameter(IDbCommand command, string parameterName, object value)
        {
            var parameter = command.CreateParameter();
            parameter.ParameterName = parameterName;
            parameter.Value = value;
            return parameter;
        }
    }
}

和测试

  [Fact]
  public void WriteData_DatabaseThrowsException_LogsError()
  {
      // Arrange
      var marketsDataUploader = new MarketsDataUploader(mockLogger.Object, connectionFactory);
      var marketsData = new List<MarketData>
      {
          new ModelRunStatistic
          {
              SchemeId = Guid.NewGuid(),
              AnalysisDate = DateTime.UtcNow,
              CreatedDate = DateTime.UtcNow,
              Duration = TimeSpan.FromSeconds(5),
      Value = 100000,
              Status = 1
          }
      };

      mockConnection.Setup(conn => conn.Open()).Throws(new InvalidOperationException("Test exception"));

      // Act
      marketsDataUploader.WriteData(marketsData);

      // Assert
      mockLogger.Verify(logger => logger.LogError(It.IsAny<InvalidOperationException>(), "Test exception"), Times.Once);
  } 

但是当它到达

mockLogger.Verify(logger => logger.LogError(It.IsAny<InvalidOperationException>(), "Test exception"), Times.Once);
时,它会返回以下错误

System.NotSupportedException: '不支持的表达式: logger => logger.LogError(It.IsAny(), "测试异常", new[] { }) 扩展方法(此处:LoggerExtensions.LogError)不得在设置/验证表达式中使用。'

有什么想法我做错了吗?

c# moq xunit ilogger
1个回答
0
投票

你可以这样做,像这样:

LogLevel expectedLevel = LogLevel.Error;
Times expectedOccasions = Times.Once;
                
loggerMock.Verify(l => l.Log(expectedLevel , It.IsAny<EventId>(),  
   It.IsAny<It.IsAnyType>(), It.IsAny<InvalidOperationException>(), 
   (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()), 
   expectedOccasions);
© www.soinside.com 2019 - 2024. All rights reserved.