Unit testing 如何对serde中使用的反序列化函数进行单元测试(使用进行反序列化)?
我有一个结构,它实现了Unit testing 如何对serde中使用的反序列化函数进行单元测试(使用进行反序列化)?,unit-testing,rust,serde,Unit Testing,Rust,Serde,我有一个结构,它实现了反序列化,并在字段上使用serde(反序列化): #[派生(调试、反序列化)] 结构记录{ 名称:String, #[serde(反序列化为=“反序列化为数值”布尔”)] 你是活跃的吗, } 反序列化\u numeric\u bool的实现将字符串“0”或“1”反序列化为相应的布尔值: pub fn反序列化数值布尔值 { 结构数字boolvisitor; 适用于数字助推器的impl{ 类型值=bool; fn预期(&self,格式化程序:&mut fmt::formatt
反序列化
,并在字段上使用serde(反序列化)
:
#[派生(调试、反序列化)]
结构记录{
名称:String,
#[serde(反序列化为=“反序列化为数值”布尔”)]
你是活跃的吗,
}
反序列化\u numeric\u bool的实现将字符串“0”或“1”反序列化为相应的布尔值:
pub fn反序列化数值布尔值
{
结构数字boolvisitor;
适用于数字助推器的impl{
类型值=bool;
fn预期(&self,格式化程序:&mut fmt::formatter)->fmt::Result{
格式化程序。写入字符串(“0或1”)
}
fn访问_u64(自身,值:u64)->结果
其中E:反序列化错误
{
匹配值{
0=>Ok(假),
1=>Ok(正确),
_=>Err(E::custom(格式!(“无效布尔:{}”,值)),
}
}
}
反序列化程序。反序列化_u64(NumericBoolVisitor)
}
(我很欣赏关于代码改进的评论)
我想为反序列化函数编写单元测试,比如反序列化\u numeric\u bool
。当然,我友好的搜索框显示了serde_测试
板条箱和一个。
但是在我的例子中,这些资源并不能帮助我,因为板条箱测试一个直接实现反序列化的结构
我的一个想法是创建一个只包含反序列化函数输出的新类型,并用它进行测试。但对我来说,这似乎是不必要的间接行为
#[派生(反序列化)]
数字布尔{
#[serde(反序列化为=“反序列化为数值”布尔”)]
值:bool
};
如何为它编写惯用测试?我当前的解决方案只使用serde
已经提供的结构。
在我的用例中,我只想测试给定的字符串是否会成功地反序列化到bool中,或者是否存在某个错误。为基本数据类型提供简单的反序列化程序,例如,其中包含u64
。它还具有一个为错误特征提供最小表示的函数,可以用于模拟错误
我的测试:我用反序列化器模拟输入,并将其传递给我的测试函数。我喜欢在那里不需要间接寻址,也不需要其他依赖项。它不像serde\u test
提供的assert\u tokens*
那么好,因为它需要错误结构,而且感觉不太好。但在我的例子中,只有一个值被反序列化,它满足了我的需求
使用serde::de::into反序列化器;
使用serde::de::value::{u64反序列化程序,StrDeserializer,Error as ValueError};
#[测试]
fn测试\数值\真值(){
让反序列化程序:U64Deserializer=1u64.into_deserializer();
assert_eq!(数值_bool(反序列化器),Ok(true));
}
#[测试]
fn测试\数值\假(){
让反序列化程序:u64反序列化程序=0u64.into_反序列化程序();
assert_eq!(数值_bool(反序列化器),Ok(false));
}
#[测试]
fn测试\数值\无效\编号(){
让反序列化程序:u64反序列化程序=2u64.into_反序列化程序();
let error=numeric_bool(反序列化程序).unwrap_err();
断言(error.description(),“无效bool:2”);
}
#[测试]
fn测试\数值\空(){
让反序列化程序:StrDeserializer=“”.进入_反序列化程序();
let error=numeric_bool(反序列化程序).unwrap_err();
assert_eq!(error.description(),“无效类型:string\”,应为0或1);
}
我希望它也能帮助其他人,或者激励其他人找到一个更完善的版本。我对惯用Serde了解得不够,无法正确回答这个问题,但您可以通过类似板条箱的方法实例化一个反序列化器
实现,这将为您提供一些可以传递给函数的信息。如果在测试中使用JSON板条箱感觉很奇怪,您可以使用类似的方法。您找到更直接的解决方案了吗?