【发布时间】:2019-07-11 08:44:53
【问题描述】:
我有一个实现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)
}
(感谢 cmets 关于代码改进)
我想为像deserialize_numeric_bool 这样的反序列化函数编写单元测试。当然,我友好的搜索框显示了serde_test crate 和documentation page about unit-testing。
但就我而言,这些资源对我没有帮助,因为 crate 测试了一个直接实现 Deserialize 的结构。
我的一个想法是创建一个新类型,它只包含我的反序列化函数的输出并用它进行测试。但这对我来说似乎是不必要的间接。
#[derive(Deserialize)]
NumericBool {
#[serde(deserialize_with = "deserialize_numeric_bool")]
value: bool
};
如何为它编写惯用的测试?
【问题讨论】:
-
我对惯用的 Serde 了解不多,无法正确回答这个问题,但您可以通过像
serde-json这样的板条箱实例化Deserializer实现,然后它会为您提供可以传递给的东西功能。如果在您的测试中使用 JSON crate 感觉很奇怪,您可以使用serde-value之类的东西。 -
你找到更直接的解决方案了吗?
标签: unit-testing rust serde