模拟 IConfigurationSection 返回字符串数组

JDB*_*ett 6 c# configuration unit-testing moq asp.net-core

使用答案来模拟IConfigurationASP.NET Core 应用程序中的方法。

我需要模拟 anIConfigurationSection返回一个string数组。

我的配置类如下所示:

public class LoggingConfiguration
{
    public string ApplicationName { get; set; }
    public string[] Loggers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

应用程序设置.json

{
    "Logging": {
        "LoggingConfiguration": {
              "ApplicationName": "Some app",
              "Loggers":  [ "DiskLogger", "MemoryLogger"],
              "DiskLogger": {
                  "SomeSettingOne" : "setting",
                  "SomeSettingTwo" : "setting",
               },
              "MemoryLogger": {
                  "AnotherSetting": "...",
               }
       }
}
Run Code Online (Sandbox Code Playgroud)

在设置模拟时 - 我有两个问题。

  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;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ala 12

作为替代方案,您可以利用ConfigurationBuilder's AddInMemoryCollection

参考内存配置提供程序

设置

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

用法

LoggingConfiguration config = configRoot.Get<LoggingConfiguration>();
Run Code Online (Sandbox Code Playgroud)