我有以下代码,
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)不得在设置/验证表达式中使用。'
有什么想法我做错了吗?
你可以这样做,像这样:
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);