【问题标题】:Mock IConfigurationSection to return array of string模拟 IConfigurationSection 以返回字符串数组
【发布时间】:2020-11-03 02:55:28
【问题描述】:

使用 this 答案模拟来自 ASP.NET Core 应用程序的 IConfiguration 方法。

我需要模拟一个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. 我不知道如何模拟将返回 string[]IConfigurationSection (loggers)
  2. 当我尝试在 LoggingSectionMock 上设置 GetChildren() 方法时遇到异常
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;
}

【问题讨论】:

  • 使用内存数据构建一个实际的 IConfiguration。尝试和模拟这一切的努力太多了。
  • 显示您正在实际尝试测试的内容。这可能是XY problem

标签: c# unit-testing asp.net-core configuration moq


【解决方案1】:

作为替代方案,您可以利用ConfigurationBuilderAddInMemoryCollection

参考Memory configuration provider

设置

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>();

【讨论】:

  • 是的。这正是我所指的。很好的答案。
  • 我喜欢这种方法 - 但我的 appsettings.json 更复杂。我更新了我的问题以显示 appsettings.json 结构。我需要获取文件的“LoggingConfiguration”部分。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 2011-02-07
  • 2011-04-21
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多