Dart序列化/反序列化测试无输出问题求助
问题解决:Dart测试中输出序列化/反序列化的实例信息
问题说明
实现了Medication、Patient、EHR类的XML/JSON序列化与反序列化逻辑,编写测试后运行,调试控制台无任何输出,希望能看到患者名称及类实例的相关信息。
解决方法
1. 在测试中主动添加打印语句
Dart的test框架默认仅在测试失败时输出详细信息,测试通过时不会主动打印自定义内容。需要在测试代码中添加print()语句,输出需要查看的数据:
修改测试文件:
import 'package:test/test.dart'; import 'assignment5.dart'; void main() { test('Serialization and deserialization', () { final medication1 = Medication( meds: "pandoil", dose: "200mg", freq: "every 4 hours", ); final medication2 = Medication( meds: "pencillin", dose: "50mg", freq: "every 6 hours", ); final patient1 = Patient( id: "1", name: "john", address: "table1", diagnosis: "covid", medications: [medication1], ); final patient2 = Patient( id: "2", name: "poul", address: "table2", diagnosis: "flue", medications: [medication2], ); final ehr = EHR(); ehr.addPatient(patient1); ehr.addPatient(patient2); // 打印原始EHR实例信息 print('原始EHR实例:$ehr'); print('患者1信息:${ehr.getPatient('1')}'); print('患者2信息:${ehr.getPatient('2')}'); final ehrJson = ehr.toJSON(); // 打印序列化后的JSON字符串 print('\n序列化后的JSON:\n$ehrJson'); final newEhr = EHR.fromJSON(ehrJson); expect(newEhr.patients.length, equals(2)); expect(newEhr.getPatient('1')!.name, equals('john')); expect(newEhr.getPatient('2')!.name, equals('poul')); // 打印反序列化后的EHR实例 print('\nJSON反序列化后的EHR:$newEhr'); final ehrXml = ehr.toXML(); // 打印序列化后的XML字符串 print('\n序列化后的XML:\n$ehrXml'); final newerEhr = EHR.fromXML(ehrXml); expect(newerEhr.patients.length, equals(2)); expect(newerEhr.getPatient('1')!.name, equals('john')); expect(newerEhr.getPatient('2')!.name, equals('poul')); // 打印XML反序列化后的EHR实例 print('\nXML反序列化后的EHR:$newerEhr'); }); }
2. 为自定义类添加toString()方法
默认情况下打印Dart类实例只会输出类似Instance of 'Patient'的模糊信息,需要重写toString()方法,让打印内容更清晰:
修改assignment5.dart中的类:
class Medication { // ... 原有代码 ... @override String toString() { return 'Medication(meds: $meds, dose: $dose, freq: $freq)'; } } class Patient { // ... 原有代码 ... @override String toString() { return 'Patient(id: $id, name: $name, address: $address, diagnosis: $diagnosis, medications: $medications)'; } } class EHR { // ... 原有代码 ... @override String toString() { return 'EHR(patients: ${patients.values.toList()})'; } }
3. 修复XML序列化的潜在问题
当前代码中Patient.toXML()和Medication.toXML()返回的是完整的XML文档(包含<?xml version="1.0"?>声明),嵌套到父元素中会导致XML格式错误,进而引发反序列化失败。需要修改这些方法,只返回元素内容而不是完整文档:
修改Medication的XML相关方法:
// 新增用于嵌套构建的方法 void buildXML(xml.XmlBuilder builder) { builder.element('Medication', nest: () { builder.element('meds', nest: meds); builder.element('dose', nest: dose); builder.element('freq', nest: freq); }); } // 保留生成完整文档的方法,用于单独序列化 String toXML() { final builder = xml.XmlBuilder(); buildXML(builder); return builder.buildDocument().toXmlString(pretty: true); }
修改Patient的XML相关方法:
// 新增用于嵌套构建的方法 void buildXML(xml.XmlBuilder builder) { builder.element('Patient', nest: () { builder.element('id', nest: id); builder.element('name', nest: name); builder.element('address', nest: address); builder.element('diagnosis', nest: diagnosis); builder.element('medications', nest: () { for (final medication in medications) { medication.buildXML(builder); } }); }); } // 保留生成完整文档的方法 String toXML() { final builder = xml.XmlBuilder(); buildXML(builder); return builder.buildDocument().toXmlString(pretty: true); }
修改EHR的toXML方法:
String toXML() { final builder = xml.XmlBuilder(); builder.element('EHR', nest: () { builder.element('patients', nest: () { for (final patient in patients.values) { patient.buildXML(builder); } }); }); return builder.buildDocument().toXmlString(pretty: true); }
运行测试
执行测试命令时,直接使用test命令即可:
dart test
此时控制台会输出你需要的所有信息,包括原始实例、序列化后的字符串、反序列化后的实例内容。
内容的提问来源于stack exchange,提问作者Denzell
相关产品推荐
相关产品推荐

