Mock IConfigurationSection để trả về mảng chuỗi
Nov 03 2020
Sử dụng câu trả lời này để mô phỏng các IConfigurationphương pháp từ ứng dụng ASP.NET Core.
Tôi cần giả lập một IConfigurationSectionđể trả về một stringmảng.
Lớp cấu hình của tôi trông như thế này:
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": "...",
}
}
Trong việc thiết lập các mô phỏng - tôi có hai vấn đề.
- Tôi không thể tìm ra cách chế nhạo một
IConfigurationSectionsẽ trả vềstring[](loggers) - Tôi nhận được một ngoại lệ khi tôi cố gắng thiết lập
GetChildren()phương thức trênLoggingSectionMock
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;
}
Trả lời
3 PeterCsala Nov 03 2020 at 15:00
Là một thay thế, bạn có thể tận dụng lợi thế của ConfigurationBuilder's AddInMemoryCollection:
Nhà cung cấp cấu hình bộ nhớ tham chiếu
Thiết lập
IConfiguration configRoot = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "ApplicationName", "App" },
{ "Loggers:0", "1" },
{ "Loggers:1", "2" },
{ "Loggers:2", "3" }
})
.Build();
Sử dụng
LoggingConfiguration config = configRoot.Get<LoggingConfiguration>();