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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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()
{
}
}
}