Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何对serde中使用的反序列化函数进行单元测试(使用进行反序列化)?_Unit Testing_Rust_Serde - Fatal编程技术网

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板条箱感觉很奇怪,您可以使用类似的方法。您找到更直接的解决方案了吗?