Mock IConfigurationSection เพื่อส่งคืนอาร์เรย์ของสตริง

Nov 03 2020

ใช้คำตอบนี้เพื่อจำลองIConfigurationวิธีการจากแอป ASP.NET Core

ฉันต้องล้อเลียนIConfigurationSectionเพื่อส่งคืนstringอาร์เรย์

คลาสการกำหนดค่าของฉันมีลักษณะดังนี้:

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

ในการตั้งค่าล้อเลียน - ฉันมีปัญหาสองประการ

  1. ฉันคิดไม่ออกว่าจะล้อเลียนสิ่งIConfigurationSectionที่จะกลับมาได้อย่างไรstring[]( loggers)
  2. ฉันได้รับข้อยกเว้นเมื่อพยายามตั้งค่าGetChildren()วิธีการในไฟล์LoggingSectionMock
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;
}

คำตอบ

3 PeterCsala Nov 03 2020 at 15:00

เป็นทางเลือกที่คุณสามารถใช้ประโยชน์จากConfigurationBuilder's AddInMemoryCollection:

ผู้ให้บริการกำหนดค่าหน่วยความจำอ้างอิง

ติดตั้ง

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

การใช้งาน

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