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");
}