(八)RestAPI 毛子(Unit Testing)
文章目录
- 项目地址
- 一、Unit Testing
- 1.1 创建X unit 测试项目
- 1. 创建项目目录
- 2. 管理包
- 1.2 创建CreateEntryDtoValidator测试
- 1.3 创建CreateEntryDtoValidator测试
项目地址
- 教程作者:
- 教程地址:
- 代码仓库地址:
- 所用到的框架和插件:
dbt
airflow
一、Unit Testing
- 适合单元测试的代码
1.1 创建X unit 测试项目
1. 创建项目目录
- 创建测试
- 目录
2. 管理包
- 修改Packages.props
- 修改项目本身的包,并且添加项目引用到api项目
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><IsPackable>false</IsPackable></PropertyGroup><ItemGroup><PackageReference Include="coverlet.collector" /><PackageReference Include="Microsoft.NET.Test.Sdk" /><PackageReference Include="xunit" /><PackageReference Include="xunit.runner.visualstudio" /></ItemGroup><ItemGroup><ProjectReference Include="..\DevHabit\DevHabit.Api\DevHabit.Api.csproj" /></ItemGroup><ItemGroup><Using Include="Xunit" /></ItemGroup></Project>
- 在api的项目配置中添加,我们就可以引用internal 类型在Unitest里
1.2 创建CreateEntryDtoValidator测试
- 创建CreateEntryDtoValidatorTests用来测试
namespace DevHabit.UnitTests.Validators;
public class CreateEntryDtoValidatorTests
{private readonly CreateEntryDtoValidator _validator = new();[Fact] // 用来定义不带参数的独立测试public async Task Validate_ShouldSucceed_WhenInputDtoIsValid(){// Arrangevar dto = new CreateEntryDto{HabitId = Habit.NewId(),Value = 1,Date = DateOnly.FromDateTime(DateTime.UtcNow)};// ActValidationResult validationResult = await _validator.ValidateAsync(dto);// AssertAssert.True(validationResult.IsValid);Assert.Empty(validationResult.Errors); //通过验证,错误列表为空}[Fact]public async Task Validate_ShouldFail_WhenHabitIdIsEmpty(){// Arrangevar dto = new CreateEntryDto{HabitId = string.Empty,Value = 1,Date = DateOnly.FromDateTime(DateTime.UtcNow)};// ActValidationResult validationResult = await _validator.ValidateAsync(dto);// AssertAssert.False(validationResult.IsValid); //验证失败ValidationFailure validationFailure = Assert.Single(validationResult.Errors); //检查错误列表里应该有且只有一个错误Assert.Equal(nameof(CreateEntryDto.HabitId), validationFailure.PropertyName); //验证这个错误是针对 HabitId 字段的}
}
1.3 创建CreateEntryDtoValidator测试
- 为加密服务创建测试
public sealed class EncryptionServiceTests
{private readonly EncryptionService _encryptionService;public EncryptionServiceTests(){IOptions<EncryptionOptions> options = Options.Create(new EncryptionOptions{Key = Convert.ToBase64String(RandomNumberGenerator.GetBytes(32))});_encryptionService = new EncryptionService(options);}[Fact]public void EncryptAndDecrypt_ShouldReturnOriginalPlainText(){// Arrangeconst string plainText = "sensitive data";string cipherText = _encryptionService.Encrypt(plainText);// Actstring decryptedText = _encryptionService.Decrypt(cipherText);// AssertAssert.Equal(plainText, decryptedText);}
}