Mock IConfigurationSection para retornar matriz de string
Nov 03 2020
Usando esta resposta para simular os IConfigurationmétodos de um aplicativo ASP.NET Core.
Preciso simular um IConfigurationSectionpara retornar um stringarray.
Minha classe de configuração é assim:
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": "...",
}
}
Ao configurar os mocks - eu tenho dois problemas.
- Não consigo descobrir como zombar de um
IConfigurationSectionque retornariastring[](loggers) - Estou recebendo uma exceção quando tento configurar o
GetChildren()método noLoggingSectionMock
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;
}
Respostas
3 PeterCsala Nov 03 2020 at 15:00
Como alternativa, você pode tirar proveito de ConfigurationBuilder's AddInMemoryCollection:
Fornecedor de configuração de memória de referência
Configuração
IConfiguration configRoot = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "ApplicationName", "App" },
{ "Loggers:0", "1" },
{ "Loggers:1", "2" },
{ "Loggers:2", "3" }
})
.Build();
Uso
LoggingConfiguration config = configRoot.Get<LoggingConfiguration>();
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?