Как издеваться над IConfiguration.GetValue

c# #unit-testing #xunit

#c# #модульное тестирование #xunit

Вопрос:

Я пытаюсь издеваться над конфигурацией, но urlVariable продолжает возвращать значение null, я также не смог издеваться над GetValue, поскольку это статическое расширение в конструкторе конфигурации

 public static T GetValue<T>(this IConfiguration configuration, string key); 
 

Вот что я пробовал до сих пор

 // Arrange
var mockIConfigurationSection = new Mock<IConfigurationSection>();
mockIConfigurationSection.Setup(x => x.Value).Returns("SomeUrl");
mockIConfigurationSection.Setup(x => x.Key).Returns("Url");

var configuration = new Mock<IConfiguration>();
configuration.Setup(c => c.GetSection(It.IsAny<String>())).Returns(mockIConfigurationSection.Object);

// Act
var result = target.Test();
 

Метод

 public async Task Test()
{
var urlVariable = this._configuration.GetValue<string>("Url");
}
 

попытка издеваться над ними из настроек приложения

 {
"profiles": {
            "LocalDB": {
                        "environmentVariables": {
                                                "Url" : "SomeUrl"
                                                }
                       }
            }
}
 

Комментарии:

1. Куда вы вводите свой mocked configuration ?

2. только для внешнего класса общедоступный класс TestClass : ITestClass закрытый только для чтения IConfiguration _configuration; общедоступный тестовый класс(конфигурация IConfiguration) { this. _configuration = конфигурация; }

3. Как вы создаете экземпляр target ? можете ли вы поделиться этим кодом?

4. здесь var target = макет. Создать<Тест>();

Ответ №1:

Возможно, вы неправильно создаете экземпляр target . Этот фрагмент кода должен работать.

 void Main()
{
    // Arrange
    var mockIConfigurationSection = new Mock<IConfigurationSection>();
    mockIConfigurationSection.Setup(x => x.Value).Returns("SomeUrl");
    mockIConfigurationSection.Setup(x => x.Key).Returns("Url");

    var configuration = new Mock<IConfiguration>();
    configuration.Setup(c => c.GetSection(It.IsAny<String>())).Returns(mockIConfigurationSection.Object);
    var target = new TestClass(configuration.Object);
    
    // Act
    var result = target.Test();
    
    //Assert
    Assert.Equal("SomeUrl", result);
}

public class TestClass 
{
    private readonly IConfiguration _configuration;
    public TestClass(IConfiguration configuration) { this._configuration = configuration; }
    public string Test()
    {
        return _configuration.GetValue<string>("Url");
    }
 }
 

Кроме того, вы можете изучить OptionsPattern

Ответ №2:

Вам не нужно издеваться над чем-то, что можно настроить вручную.
Используется ConfigurationBuilder для настройки ожидаемых значений.

 [Fact]
public void TestConfiguration()
{
    var value = new KeyValuePair<string, string>(
        "profiles:LocalDb:environmentVariable:Url", 
        "http://some.url"
    );            
    var configuration = new ConfigurationBuilder()
        .AddInMemoryCollection(new[] { value })
        .Build();

    var actual = 
        configuration.GetValue<string>("profiles:LocalDb:environmentVariable:Url");

    actual.Should().Be("http://some.url");
}