Mapster映射器:如何对配置进行单元测试?
如何对Mapster映射配置进行单元测试
1. 测试基础映射结果
最直接的方式是创建测试实例,执行映射后验证目标对象的属性是否符合预期。
假设我们有以下类:
public class User { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public class UserDto { public int Id { get; set; } public string FullName { get; set; } }
对应的映射配置:
TypeAdapterConfig<User, UserDto>.NewConfig() .Map(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");
使用xUnit编写单元测试:
[Fact] public void User_To_UserDto_Maps_All_Properties_Correctly() { // 准备测试数据 var user = new User { Id = 1, FirstName = "Jane", LastName = "Smith" }; // 执行映射 var dto = user.Adapt<UserDto>(); // 验证结果 Assert.Equal(user.Id, dto.Id); Assert.Equal($"{user.FirstName} {user.LastName}", dto.FullName); }
2. 验证映射配置的有效性
Mapster内置了Validate()方法,可以检查配置是否存在语法错误、类型不匹配等问题,一旦有无效配置会直接抛出异常,让测试失败。
验证全局配置
[Fact] public void Mapster_Global_Configuration_Is_Valid() { // 验证所有已注册的映射配置 TypeAdapterConfig.GlobalSettings.Validate(); }
验证特定映射配置
[Fact] public void User_To_UserDto_Configuration_Is_Valid() { TypeAdapterConfig<User, UserDto>.Config.Validate(); }
3. 检查未映射属性(避免遗漏)
如果要确保源类和目标类的所有属性都被正确映射,可以通过Mapster的API检测未映射的属性,或者在配置阶段强制禁止未映射。
方式一:强制禁止未映射
在全局配置中设置不允许未映射属性,这样Validate()时会直接报错:
// 全局配置(可放在启动逻辑中) TypeAdapterConfig.GlobalSettings.Default .IgnoreUnmapped(false); // 关闭"忽略未映射属性"的默认行为
然后执行验证测试,一旦有未映射的属性,测试会失败。
方式二:手动检测未映射属性
[Fact] public void User_To_UserDto_Has_No_Unmapped_Properties() { var config = TypeAdapterConfig<User, UserDto>.Config; var unmapped = config.GetUnmappedProperties(); // 断言源类和目标类都没有未映射的属性 Assert.Empty(unmapped.SourceProperties); Assert.Empty(unmapped.DestinationProperties); }
4. 测试自定义映射逻辑
如果使用了自定义转换器、解析器或映射规则,需要单独测试这些逻辑的正确性。
比如自定义日期字符串解析器:
public class CustomDateParser : IRegister { public void Register(TypeAdapterConfig config) { config.NewConfig<string, DateTime>() .MapWith(src => DateTime.ParseExact(src, "yyyy-MM-dd", CultureInfo.InvariantCulture)); } }
测试这个解析器:
[Fact] public void Custom_Date_Parser_Converts_String_Correctly() { var dateStr = "2024-06-15"; var result = dateStr.Adapt<DateTime>(); Assert.Equal(new DateTime(2024, 6, 15), result); }
内容的提问来源于stack exchange,提问作者Wazzouille
相关产品推荐
相关产品推荐

