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

如何独立测试serde的with属性对应模块的序列化与反序列化函数

解决方案

你完全可以直接用serde_test提供的基础Serializer/Deserializer实现测试目标函数,不需要额外封装带#[serde(with)]的测试结构体:

第一步:添加开发依赖

在Cargo.toml的[dev-dependencies]块中加入:

serde_test = "1.0"

第二步:编写序列化测试

直接调用你实现的serialize函数,传入serde_test::Serializer实例,校验生成的Token流即可:

use serde_test::{Serializer, Token};
use your_crate::{StringPair, stringpair_serde};

#[test]
fn test_stringpair_serialize() {
    let test_pair = StringPair("foo".to_string(), "bar".to_string());
    let mut ser = Serializer::new();
    
    stringpair_serde::serialize(&test_pair, &mut ser).unwrap();
    assert_eq!(ser.tokens(), &[Token::Str("foo:bar")]);
}

第三步:编写反序列化测试

构造对应的Token流传入serde_test::Deserializer,直接调用deserialize函数校验返回结果:

use serde_test::Deserializer;

#[test]
fn test_stringpair_deserialize_normal() {
    let mut de = Deserializer::new(&[Token::Str("baz:qux")]);
    let result: StringPair = stringpair_serde::deserialize(&mut de).unwrap();
    
    assert_eq!(result, StringPair("baz".to_string(), "qux".to_string()));
}

#[test]
fn test_stringpair_deserialize_invalid() {
    // 测试无冒号的异常场景
    let mut de = Deserializer::new(&[Token::Str("invalid_str")]);
    let result: StringPair = stringpair_serde::deserialize(&mut de).unwrap();
    
    assert_eq!(result, StringPair::default());
}

这种测试方案不绑定任何特定序列化格式(比如JSON、YAML等),完全模拟Serde框架调用with模块函数的原生逻辑,覆盖所有符合Serde规范的Serializer/Deserializer实现,刚好匹配你需要独立测试stringpair_serde模块的需求。

内容的提问来源于stack exchange,提问作者Zia Ur Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 07:27:04