You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:34:57