using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace OptionStudy.Next { /// /// 5.2 配置模型 /// IConfigurationProvider 测试 /// IConfigrutionProvider 被设计为 IConfigurationSource 构建,并保持在 IConfigurationBuilder 的属性中 /// 所以一般不单独实例化出来使用,而是配合 IConfigurationSource 和 IConfigurationBuilder 使用 /// public class IConfigurationProviderTest: IDisposable { private readonly ITestOutputHelper testOutput; private IDictionary memoryData = new Dictionary() { ["AppName"] = "MemoryAppName", ["AppVersion"] = "0.0.0.1", ["EMail:ReceiveAddress"] = "memory@163.com", ["EMail:Recipient"] = "memory", }; public IConfigurationProviderTest(ITestOutputHelper testOutputHelper) { testOutput = testOutputHelper; } /// /// 实例化配置提供者 /// [Fact] public void IConfigrutionProvider_New_Test() { //不配合 IConfigrutionSource 直接实例化,将会异常 Action createAction = () => { var provider = new MemoryConfigurationProvider(null); }; Assert.ThrowsAny(createAction); //关联 ConfigurationSource var source = new MemoryConfigurationSource() { InitialData = new Dictionary() { ["TestName"]="MyTest"} }; var provider = new MemoryConfigurationProvider(source); Assert.NotNull(provider); //可以进行各种操作 Action run = () => { provider.Set("TestName", "UpdateName"); if (!provider.TryGet("Demo",out string _v)) { provider.Add("Demo", "demo"); } provider.Load(); }; //断言不发生异常 //方法一:使用 FluentAssertions 库 run.Should().NotThrow(); //方法二:xUnit 变通方法 var exception = Record.Exception(run); Assert.Null(exception); } /// /// 获取 IConfigrution 手动添加配置源 /// 方法一:ConfigurationSource Build()方法 /// 说明:参数为空值,框架设置的参数并没有在初始化中直接使用,可能是强调与 ConfigurationBuilder 关系吧 /// IConfigurationProvider 应该由 IConfigurationBuilder 创建,基本是写在扩展方法里,这样设计可能是强调这种编程使用方式吧 /// [Fact] public void IConfigrutionProvider_Create_1_Test() { //内存配置源 MemoryConfigurationSource source = new MemoryConfigurationSource() { InitialData= memoryData, }; //内存配置提供者:实际上由配置源提供,构建过程中直接使用配置源,不需要单独提出来 var provider = source.Build(null); //直接使用配置源,无需显式使用 Provider var builder = new ConfigurationBuilder().Add(source); var configrution = builder.Build(); Assert.NotNull(configrution); } public void Dispose() { } } }