// using Dpz.Core.Infrastructure;
// using Microsoft.Extensions.Configuration;
// using Refit;
// using Xunit.Abstractions;
//
// namespace Dpz.Core.Service.Network.Test;
//
// public class ReadConfigurationTest
// {
//     private readonly ITestOutputHelper _testOutputHelper;
//
//     public ReadConfigurationTest(ITestOutputHelper testOutputHelper)
//     {
//         _testOutputHelper = testOutputHelper;
//     }
//
//     [Fact]
//     public IConfigurationBuilder Load_Local_Configuration()
//     {
//         var configBuilder = new ConfigurationBuilder()
//             .AddJsonFile("appsettings.Test.json");
//
//         Assert.NotNull(configBuilder);
//
//         return configBuilder;
//     }
//
//     [Fact]
//     public string Read_Config_Host()
//     {
//         var host = Load_Local_Configuration().Build().GetSection("config")["Host"];
//         Assert.NotEmpty(host);
//         return host;
//     }
//
//     [Theory]
//     [InlineData("/config/appsettings.json")]
//     public string CalculateSign(string uri)
//     {
//         var key = Load_Local_Configuration().Build().GetSection("config")["Key"];
//         Assert.NotEmpty(key);
//
//         var timeStamp = DateTime.Now.AddSeconds(15).ToTimeStamp();
//         var md5 = $"{key}&{timeStamp}&{uri}".GenerateHashMd5();
//         var sign = md5.Substring(12, 8) + timeStamp;
//
//         Assert.NotEmpty(sign);
//         return sign;
//     }
//
//     [Theory]
//     [InlineData("/config/appsettings.json")]
//     public async Task<string> Read_First_Network_Config(string uri)
//     {
//         var host = Read_Config_Host();
//         var sign = CalculateSign(uri);
//
//         var readConfiguration = RestService.For<IReadConfiguration>(host);
//
//         var response = await readConfiguration.ReadConfigurationAsync(sign);
//
//         Assert.Null(response.Error);
//
//         Assert.NotNull(response.Content);
//
//         using var reader = new StreamReader(response.Content);
//         var content = await reader.ReadToEndAsync();
//
//         Assert.NotEmpty(content);
//
//         _testOutputHelper.WriteLine(content);
//
//         return content;
//     }
// }
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个使用 xUnit 测试框架编写的配置读取测试类。让我逐一解释代码的各个部分:

类的基本结构

public class ReadConfigurationTest
{
    private readonly ITestOutputHelper _testOutputHelper;
    
    public ReadConfigurationTest(ITestOutputHelper testOutputHelper)
    {
        _testOutputHelper = testOutputHelper;
    }
}
  • 这是一个测试类,用于测试配置读取功能
  • ITestOutputHelper 用于在测试过程中输出信息,便于调试

测试方法分析

1. Load_Local_Configuration() 方法

[Fact]
public IConfigurationBuilder Load_Local_Configuration()
{
    var configBuilder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.Test.json");
    
    Assert.NotNull(configBuilder);
    return configBuilder;
}
  • 目的: 加载本地测试配置文件
  • 功能: 创建配置构建器并加载 appsettings.Test.json 文件
  • 返回: 配置构建器对象

2. Read_Config_Host() 方法

[Fact]
public string Read_Config_Host()
{
    var host = Load_Local_Configuration().Build().GetSection("config")["Host"];
    Assert.NotEmpty(host);
    return host;
}
  • 目的: 从配置文件中读取主机地址
  • 功能: 获取配置中 config 节点下的 Host
  • 验证: 确保主机地址不为空

3. CalculateSign() 方法

[Theory]
[InlineData("/config/appsettings.json")]
public string CalculateSign(string uri)
{
    var key = Load_Local_Configuration().Build().GetSection("config")["Key"];
    Assert.NotEmpty(key);
    
    var timeStamp = DateTime.Now.AddSeconds(15).ToTimeStamp();
    var md5 = $"{key}&{timeStamp}&{uri}".GenerateHashMd5();
    var sign = md5.Substring(12, 8) + timeStamp;
    
    Assert.NotEmpty(sign);
    return sign;
}
  • 目的: 生成API调用签名
  • 签名算法:
    1. 获取配置中的密钥(Key)
    2. 生成时间戳(当前时间 + 15秒)
    3. 组合字符串:{key}&{timeStamp}&{uri}
    4. 对组合字符串进行MD5加密
    5. 取MD5结果的第12-19位(8个字符)+ 时间戳作为最终签名

4. Read_First_Network_Config() 方法

[Theory]
[InlineData("/config/appsettings.json")]
public async Task<string> Read_First_Network_Config(string uri)
{
    var host = Read_Config_Host();
    var sign = CalculateSign(uri);
    
    var readConfiguration = RestService.For<IReadConfiguration>(host);
    
    var response = await readConfiguration.ReadConfigurationAsync(sign);
    
    Assert.Null(response.Error);
    Assert.NotNull(response.Content);
    
    using var reader = new StreamReader(response.Content);
    var content = await reader.ReadToEndAsync();
    
    Assert.NotEmpty(content);
    
    _testOutputHelper.WriteLine(content);
    
    return content;
}
  • 目的: 通过网络API读取远程配置
  • 流程:
    1. 获取主机地址和计算签名
    2. 使用 Refit 创建HTTP客户端
    3. 调用远程配置读取API
    4. 验证响应无错误且有内容
    5. 读取并输出响应内容

技术特点

  1. 依赖注入: 使用构造函数注入测试输出助手
  2. 配置管理: 使用 IConfiguration 读取JSON配置文件
  3. HTTP客户端: 使用 Refit 库简化HTTP API调用
  4. 安全性: 实现了基于时间戳和MD5的签名机制
  5. 异步编程: 使用 async/await 进行异步HTTP调用
  6. 单元测试: 使用 xUnit 的 [Fact][Theory] 特性

这个测试类主要验证了从本地配置文件读取设置,生成安全签名,以及通过网络API获取远程配置的完整流程。

评论加载中...