如何独立测试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
相关产品推荐
相关产品推荐

