Mock IConfigurationSection để trả về mảng chuỗi

Nov 03 2020

Sử dụng câu trả lời này để mô phỏng các IConfigurationphương pháp từ ứng dụng ASP.NET Core.

Tôi cần giả lập một IConfigurationSectionđể trả về một stringmảng.

Lớp cấu hình của tôi trông như thế này:

public class LoggingConfiguration
{
    public string ApplicationName { get; set; }
    public string[] Loggers { get; set; }
}

appsettings.json

{
    "Logging": {
        "LoggingConfiguration": {
              "ApplicationName": "Some app",
              "Loggers":  [ "DiskLogger", "MemoryLogger"],
              "DiskLogger": {
                  "SomeSettingOne" : "setting",
                  "SomeSettingTwo" : "setting",
               },
              "MemoryLogger": {
                  "AnotherSetting": "...",
               }
       }

Trong việc thiết lập các mô phỏng - tôi có hai vấn đề.

  1. Tôi không thể tìm ra cách chế nhạo một IConfigurationSectionsẽ trả về string[]( loggers)
  2. Tôi nhận được một ngoại lệ khi tôi cố gắng thiết lập GetChildren()phương thức trênLoggingSectionMock
public void Setup()
{
    var applicationNameConfigurationSectionMock = new Mock<IConfigurationSection>();
    applicationNameConfigurationSectionMock.Setup(m => m.Value).Returns(TestingApplicationName);

    var loggerNamesConfigurationSectionMock = new Mock<IConfigurationSection>();
    loggerNamesConfigurationSectionMock.Setup(m => m.GetChildren()).Returns(GetLoggerNamesSection);

    //Throwing Method Not Found exception
    LoggingSectionMock.Setup(m => m.GetChildren()).Returns(new List<IConfigurationSection>
        {applicationNameConfigurationSectionMock.Object, loggerNamesConfigurationSectionMock.Object});

    ConfigurationMock.Setup(m => m.GetSection($"{Logging}:{LoggingConfiguration}"))
        .Returns(() => LoggingSectionMock.Object);
}

private IEnumerable<IConfigurationSection> GetLoggerNamesSection()
{
    var loggerNamesConfigurationSections = new List<IConfigurationSection>();
    LoggerNames.ToList().ForEach(loggerName =>
    {
        var configSectionMock = new Mock<IConfigurationSection>();
        configSectionMock.Setup(m => m.Value).Returns(loggerName);
        loggerNamesConfigurationSections.Add(configSectionMock.Object);
    });
    return loggerNamesConfigurationSections;
}

Trả lời

3 PeterCsala Nov 03 2020 at 15:00

Là một thay thế, bạn có thể tận dụng lợi thế của ConfigurationBuilder's AddInMemoryCollection:

Nhà cung cấp cấu hình bộ nhớ tham chiếu

Thiết lập

IConfiguration configRoot = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string>
    {
        { "ApplicationName", "App" }, 
        { "Loggers:0", "1" },
        { "Loggers:1", "2" },
        { "Loggers:2", "3" }
    })
    .Build();

Sử dụng

LoggingConfiguration config = configRoot.Get<LoggingConfiguration>();