我有一个结构体,实现了Deserialize
并在一个字段上使用了serde(deserialize_with)
:
#[derive(Debug, Deserialize)]
struct Record {
name: String,
#[serde(deserialize_with = "deserialize_numeric_bool")]
is_active: bool,
}
deserialize_numeric_bool
的实现将字符串 "0" 或 "1" 反序列化为相应的布尔值:
pub fn deserialize_numeric_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
where D: Deserializer<'de>
{
struct NumericBoolVisitor;
impl<'de> Visitor<'de> for NumericBoolVisitor {
type Value = bool;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("either 0 or 1")
}
fn visit_u64<E>(self, value: u64) -> Result<bool, E>
where E: DeserializeError
{
match value {
0 => Ok(false),
1 => Ok(true),
_ => Err(E::custom(format!("invalid bool: {}", value))),
}
}
}
deserializer.deserialize_u64(NumericBoolVisitor)
}
(我感激有关代码改进的评论)
我想为反序列化函数编写单元测试,例如deserialize_numeric_bool。 当然,我的友好搜索框显示了
serde_test包和有关单元测试的文档页面。 但是,在我的情况下,这些资源无法帮助我,因为该包是直接实现
Deserialize的结构体的测试。
我想到的一个想法是创建一个新类型,其中仅包含我的反序列化函数的输出,并对其进行测试。 但对我来说,这似乎是不必要的间接操作。
#[derive(Deserialize)]
NumericBool {
#[serde(deserialize_with = "deserialize_numeric_bool")]
value: bool
};
我该如何编写符合惯用语的测试?
serde-json
这样的 crate 实例化一个Deserializer
实现,然后将其传递到函数中。如果在测试中使用 JSON crate 感觉奇怪,你可以使用类似serde-value
的东西。 - Joe Clay