namespace OptionStudy.Next { /// /// 5.2 配置模型 /// IConfiguration 测试 /// public class IConfigurationTest : IDisposable { private readonly ITestOutputHelper testOutput; private IDictionary sharedMemoryData = new Dictionary() { ["AppName"] = "MemoryAppName", ["AppVersion"] = "0.0.0.1", ["EMail:ReceiveAddress"] = "memory@163.com", ["EMail:Recipient"] = "memory", }; public IConfigurationTest(ITestOutputHelper testOutputHelper) { testOutput = testOutputHelper; } /// /// 获取 IConfigrution 扩展方法添加数据源 /// IConfigrution 极少直接实例化,通常是由 IConfigurationBuilder 设置之后,调用 Build 方法构建出来的。 /// [Fact] public void IConfigrution_Build_AddInMemoryCollection_Test() { var builder = new ConfigurationBuilder(); IConfigurationRoot? configrution = builder.AddInMemoryCollection(sharedMemoryData).Build(); Assert.NotNull(configrution); Assert.Single(configrution.Providers); Assert.True(configrution["AppName"] == "MemoryAppName"); } /// /// 获取 IConfigrution /// ConfigurationBuilder Add()方法 /// [Fact] public void IConfigrution_Build_Add_Test() { //内存配置源 MemoryConfigurationSource source = new MemoryConfigurationSource() { InitialData = sharedMemoryData, }; var configrution = new ConfigurationBuilder().Add(source).Build(); Assert.NotNull(configrution); Assert.Equal(3, configrution.GetChildren().Count()); } /// /// 获取 IConfigrution 手动添加配置源 /// [Fact] public void IConfigrution_Build_AddT_Test() { var configrution = new ConfigurationBuilder() .Add(source => { source.InitialData = sharedMemoryData; }) .Build(); Assert.NotNull(configrution); Assert.Equal(3, configrution.GetChildren().Count()); } /// /// IConfigrutionRoot /// [Fact] public void IConfigrutionRoot_Test() { var builder = new ConfigurationBuilder(); var root = builder.AddInMemoryCollection(sharedMemoryData).Build(); Assert.NotNull(root); } /// /// IConfigrutionRoot Provider /// [Fact] public void IConfigrutionRoot_Provider_Test() { var root = new ConfigurationBuilder().AddInMemoryCollection(sharedMemoryData).Build(); Assert.NotNull(root); var providers = root.Providers; Assert.Single(providers); var memoryProvider = providers.FirstOrDefault() as MemoryConfigurationProvider; Assert.NotNull(memoryProvider); } /// /// IConfigrutionRoot 重新加载 /// 内存配置源 /// Load() 方法为空,重新加载不起作用。 /// 通过 Add 添加的配置项,一直保留到程序结束 /// [Fact] public void IConfigrutionRoot_Reload_MemorySource_Test() { var builder = new ConfigurationBuilder(); var root = builder.AddInMemoryCollection(sharedMemoryData).Build(); var provider = root.Providers.First() as MemoryConfigurationProvider; //设置:改变数据源 provider?.Set("AppName", "UpdateAppName"); Assert.Equal("UpdateAppName", root["AppName"]); // MemoryConfigurationProvider 有个特别的 Add 方法 provider?.Add("AddKey", "AddValue"); Assert.Equal("AddValue", root["AddKey"]); //重新加载:改变的值不会恢复,一直保持 root.Reload(); //MemoryConfigurationProvider Load()方法,什么都没做,所以更新值被保留 provider?.Load(); Assert.Equal("UpdateAppName", root["AppName"]); Assert.NotEqual("MemoryAppName", root["AppName"]); } /// /// IConfigrutionRoot 重新加载 /// 命令行配置源:重新加载后,修改的配置项被恢复 /// 环境变量与文件类配置源,同理也会被恢复 /// [Fact] public void IConfigrutionRoot_Reload_ComandSource_Test() { var builder = new ConfigurationBuilder(); var root = builder.AddCommandLine(new string[] { "AppName=CommandAppName", "EMail:ReceiveAddress=command@163.com" }).Build(); //设置:改变数据源 var provider = root.Providers.First() as CommandLineConfigurationProvider; provider?.Set("AppName", "UpdateAppName"); Assert.Equal("UpdateAppName", root["AppName"]); //重新加载:改变的值被恢复 root.Reload(); Assert.NotEqual("UpdateAppName", root["AppName"]); Assert.Equal("CommandAppName", root["AppName"]); } /// /// IConfigrutionRoot 索引 /// 功能和规则同 GetSection 方法 /// [Fact] public void IConfigrutionRoot_Index_Test() { var root = new ConfigurationBuilder().AddInMemoryCollection(sharedMemoryData).Build(); Assert.NotNull(root); Assert.Equal("MemoryAppName", root["AppName"]); Assert.Equal("0.0.0.1", root["AppVersion"]); Assert.Equal("memory@163.com", root["EMail:ReceiveAddress"]); Assert.Equal("memory", root["EMail:Recipient"]); Assert.Null(root["NotExcits_xxxxxxx"]); Assert.Null(root["EMail:NotExcits_xxxxxxx"]); } /// /// IConfigrutionRoot GetSection /// [Fact] public void IConfigrutionRoot_GetSection_Test() { IDictionary data = new Dictionary() { ["A:B:C:D"] = "ABCD", }; var root = new ConfigurationBuilder().AddInMemoryCollection(data).Build(); Assert.NotNull(root); var sectionABCD1 = root.GetSection("A:B:C:D"); var sectionABCD2 = root.GetSection("A:B:C").GetSection("D"); var sectionABCD3 = root.GetSection("A:B").GetSection("C:D"); var sectionABCD4 = root.GetSection("A").GetSection("B").GetSection("C").GetSection("D"); //虽然均指向同一个配置节点,但是引用对象却不同:因为 GetSection() 总是会创建新的 IConfigrutionSection 对象 Assert.Equal("ABCD", sectionABCD1.Value); Assert.Equal("ABCD", sectionABCD2.Value); Assert.Equal("ABCD", sectionABCD3.Value); Assert.Equal("ABCD", sectionABCD4.Value); Assert.NotEqual(sectionABCD1, sectionABCD2); Assert.NotEqual(sectionABCD3, sectionABCD4); //获取不存在的节点时,不是返回null,而是正常返回节点,只是节点的值为null var sectionNoExsit = root.GetSection("NoExsit"); Assert.NotNull(sectionNoExsit); } /// /// IConfigrutionRoot GetChildren /// 获取直接子代配置子节 /// [Fact] public void IConfigrutionRoot_GetChildren_Test() { var root = new ConfigurationBuilder().AddInMemoryCollection(sharedMemoryData).Build(); var chields = root.GetChildren().ToList(); //个数是3,而不是4:获取的是直接子代配置子节点 //第三个是 EMail 节点(EMail:ReceiveAddress与EMail:Recipient的父节点) Assert.Equal(3,chields.Count); Assert.Equal("MemoryAppName", chields[0].Value); Assert.Null( chields[2].Value); Assert.Equal(2, chields[2].GetChildren().Count()); } public void Dispose() { } } }