You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
8.3 KiB
C#

2 years ago

namespace OptionStudy.Next
{
/// <summary>
/// 5.2 配置模型
/// IConfiguration 测试
/// </summary>
public class IConfigurationTest : IDisposable
{
private readonly ITestOutputHelper testOutput;
private IDictionary<string, string?> sharedMemoryData = new Dictionary<string, string?>()
{
["AppName"] = "MemoryAppName",
["AppVersion"] = "0.0.0.1",
["EMail:ReceiveAddress"] = "memory@163.com",
["EMail:Recipient"] = "memory",
};
public IConfigurationTest(ITestOutputHelper testOutputHelper)
{
testOutput = testOutputHelper;
}
/// <summary>
/// 获取 IConfigrution 扩展方法添加数据源
/// IConfigrution 极少直接实例化,通常是由 IConfigurationBuilder 设置之后,调用 Build 方法构建出来的。
/// </summary>
[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");
}
/// <summary>
/// 获取 IConfigrution
/// ConfigurationBuilder Add()方法
/// </summary>
[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());
}
/// <summary>
/// 获取 IConfigrution 手动添加配置源
/// </summary>
[Fact]
public void IConfigrution_Build_AddT_Test()
{
var configrution = new ConfigurationBuilder()
.Add<MemoryConfigurationSource>(source =>
{
source.InitialData = sharedMemoryData;
})
.Build();
Assert.NotNull(configrution);
Assert.Equal(3, configrution.GetChildren().Count());
}
/// <summary>
/// IConfigrutionRoot
/// </summary>
[Fact]
public void IConfigrutionRoot_Test()
{
var builder = new ConfigurationBuilder();
var root = builder.AddInMemoryCollection(sharedMemoryData).Build();
Assert.NotNull(root);
}
/// <summary>
/// IConfigrutionRoot Provider
/// </summary>
[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);
}
/// <summary>
/// IConfigrutionRoot 重新加载
/// 内存配置源
/// Load() 方法为空,重新加载不起作用。
/// 通过 Add 添加的配置项,一直保留到程序结束
/// </summary>
[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"]);
}
/// <summary>
/// IConfigrutionRoot 重新加载
/// 命令行配置源:重新加载后,修改的配置项被恢复
/// 环境变量与文件类配置源,同理也会被恢复
/// </summary>
[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"]);
}
/// <summary>
/// IConfigrutionRoot 索引
/// 功能和规则同 GetSection 方法
/// </summary>
[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"]);
}
/// <summary>
/// IConfigrutionRoot GetSection
/// </summary>
[Fact]
public void IConfigrutionRoot_GetSection_Test()
{
IDictionary<string, string?> data = new Dictionary<string, string?>()
{
["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);
}
/// <summary>
/// IConfigrutionRoot GetChildren
/// 获取直接子代配置子节
/// </summary>
[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()
{
}
}
}