Mock IConfigurationSection untuk mengembalikan larik string

Nov 03 2020

Menggunakan jawaban ini untuk mengejek IConfigurationmetode dari aplikasi ASP.NET Core.

Saya perlu mengejek IConfigurationSectionuntuk mengembalikan stringarray.

Kelas konfigurasi saya terlihat seperti ini:

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": "...",
               }
       }

Dalam menyiapkan olok-olok - Saya punya dua masalah.

  1. Saya tidak tahu bagaimana cara mengejek IConfigurationSectionyang akan kembali string[]( loggers)
  2. Saya mendapatkan pengecualian saat saya mencoba menyiapkan GetChildren()metode diLoggingSectionMock
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;
}

Jawaban

3 PeterCsala Nov 03 2020 at 15:00

Sebagai alternatif Anda dapat mengambil keuntungan dari ConfigurationBuilder's AddInMemoryCollection:

Penyedia konfigurasi Memori Referensi

Mendirikan

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

Pemakaian

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