C # как смоделировать Configuration.GetSection ("foo: bar"). Получить <List <string>> () - PullRequest
0 голосов
/ 06 мая 2018

У меня есть список, подобный следующему в файле config.json `

{
  "foo": {
    "bar": [
      "1",
      "2",
      "3"
    ]
  }
}`

Я могу получить список во время выполнения, используя

Configuration.GetSection("foo:bar").Get<List<string>>()

Я хочу издеваться над configuration.GetSection для написания модульного теста.

Следующий синтаксис не работает

mockConfigRepo
    .SetupGet(x => x.GetSection("reportLanguageSettings:reportLanguageList").Get<List<string>>())
    .Returns(reportLanguages);

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я столкнулся с той же проблемой и обнаружил, что мне нужно было создать фиктивную IConfigurationSection для каждого элемента в массиве, а также сам узел массива, а затем настроить родительский узел, чтобы он возвращал потомков, и потомок, чтобы они возвращали свои значения. , В примере с OP это будет выглядеть так:

        var oneSectionMock = new Mock<IConfigurationSection>();
        oneSectionMock.Setup(s => s.Value).Returns("1");
        var twoSectionMock = new Mock<IConfigurationSection>();
        twoSectionMock.Setup(s => s.Value).Returns("2");
        var fooBarSectionMock = new Mock<IConfigurationSection>();
        fooBarSectionMock.Setup(s => s.GetChildren()).Returns(new List<IConfigurationSection> { oneSectionMock.Object, twoSectionMock.Object });
        _configurationMock.Setup(c => c.GetSection("foo:bar")).Returns(fooBarSectionMock.Object);

P.S. Я использую Moq, поэтому, пожалуйста, переведите вашу любимую библиотеку на ваш выбор.

P.P.S. Если вас интересует, почему это работает, что делает немодируемый метод Get () или у вас более сложный сценарий, чем OP, чтение этого класса может быть полезно: https://github.com/aspnet/Extensions/blob/release/2.1/src/Configuration/Config.Binder/src/ConfigurationBinder.cs

0 голосов
/ 30 августа 2018

Вы можете попробовать альтернативные способы. Например, вы можете попытаться создать экземпляр ConfigurationBuilder в своем тестовом классе:

string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfiguration config = new ConfigurationBuilder()
   .SetBasePath(projectPath)
   .AddJsonFile("config.json")
   .Build();

Примечание : Пожалуйста, не забудьте добавить свой файл config.json в свой тестовый проект.

...