如何为Dart的GroupDbConverter双向模型转换器编写单元测试
Group双向模型转换器单元测试实现方案
转换器类单元测试的核心逻辑非常直接:构造固定的输入实例,调用转换方法后,逐字段校验输出结果和预期完全一致,同时覆盖代码里的特殊分支逻辑,不需要引入复杂mock,因为转换器是纯逻辑类,无外部依赖。
核心测试覆盖点
- 数据库模型转本地模型常规场景:验证所有映射字段值完全匹配,无错配、漏赋值
- 本地模型转数据库模型常规场景:验证非空字段映射正确
- 本地模型转数据库模型边界场景:验证
groupName为null时,自动赋值为空字符串的特殊逻辑 - (可选)往返一致性校验:本地模型转数据库模型再转回本地模型,核心业务字段值不丢失
补全后的可运行测试代码
main() { group('GroupDbConverter', () { late GroupDbConverter groupConverter; // 提前初始化共用实例,减少重复代码 setUp(() { groupConverter = GroupDbConverter(); }); test('数据库模型转本地模型时,所有字段应正确映射', () { // 构造固定测试输入 final testDbModel = GroupDBData( id: 1, groupName: '测试分组', ); // 执行转换(如果基类没有封装公共convert方法,直接调用processConvertInToOut即可) final result = groupConverter.convertInToOut(testDbModel); // 逐字段校验结果 expect(result.id, 1); expect(result.groupName, '测试分组'); }); test('本地模型转数据库模型时,非空字段应正确映射', () { final testLocalModel = Group( id: 2, groupName: '日常分组', ); final result = groupConverter.convertOutToIn(testLocalModel); expect(result.id, 2); expect(result.groupName, '日常分组'); }); test('本地模型groupName为null时,转数据库模型应自动赋值为空字符串', () { final testLocalModel = Group( id: 3, groupName: null, ); final result = groupConverter.convertOutToIn(testLocalModel); expect(result.id, 3); expect(result.groupName, ''); }); test('双向转换往返后核心字段值应保持一致', () { final originLocalModel = Group( id: 4, groupName: '工作分组', ); // 先转库表模型再转回本地模型 final dbModel = groupConverter.convertOutToIn(originLocalModel); final convertedBackModel = groupConverter.convertInToOut(dbModel); expect(convertedBackModel.id, originLocalModel.id); expect(convertedBackModel.groupName, originLocalModel.groupName); }); }); }
注意事项
- 不要只校验返回结果的类型,必须逐字段校验值,否则字段赋值错漏无法被测试捕获
- 只要转换器里存在分支逻辑(比如本次的
groupName ?? ''空值处理),必须单独写用例覆盖,不能只测正常传值场景 - 纯数据转换类不要用mock,直接构造真实模型实例即可,测试逻辑越简单越不容易出误判
- 如果你的BaseConverter没有对外封装公共convert方法,直接调用重写的
processConvertInToOut/processConvertOutToIn方法即可,测试逻辑不变
内容的提问来源于stack exchange,提问作者userName
相关产品推荐
相关产品推荐

