// 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调用签名
- 签名算法:
- 获取配置中的密钥(Key)
- 生成时间戳(当前时间 + 15秒)
- 组合字符串:
{key}&{timeStamp}&{uri} - 对组合字符串进行MD5加密
- 取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读取远程配置
- 流程:
- 获取主机地址和计算签名
- 使用 Refit 创建HTTP客户端
- 调用远程配置读取API
- 验证响应无错误且有内容
- 读取并输出响应内容
技术特点
- 依赖注入: 使用构造函数注入测试输出助手
- 配置管理: 使用
IConfiguration读取JSON配置文件 - HTTP客户端: 使用 Refit 库简化HTTP API调用
- 安全性: 实现了基于时间戳和MD5的签名机制
- 异步编程: 使用 async/await 进行异步HTTP调用
- 单元测试: 使用 xUnit 的
[Fact]和[Theory]特性
这个测试类主要验证了从本地配置文件读取设置,生成安全签名,以及通过网络API获取远程配置的完整流程。
AI 正在分析代码…
评论加载中...