是否可以在运行测试时仅为结构实现特征?

时间:2017-03-06 21:07:14

标签: rust

我正在使用quickcheck,并希望为结构实现quickcheck::Arbitrary。此特征必须存在于定义结构的同一文件/包中,但我不希望它在发布二进制文件中。

pub struct c_struct {
    pub i64_: i64,
    pub u64_: u64,
    pub u32_: u32,
}

// #[cfg(test)] does not work
impl quickcheck::Arbitrary for c_struct {
    fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> c_struct {
        c_struct {
            i64_: i64::arbitrary(g),
            u64_: u64::arbitrary(g),
            u32_: u32::arbitrary(g),
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以在此处使用条件编译属性#[cfg()]

pub struct c_struct {
    pub i64_: i64,
    pub u64_: u64,
    pub u32_: u32,
}

#[cfg(test)]
impl quickcheck::Arbitrary for c_struct {
    fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> c_struct {
        c_struct {
            i64_: i64::arbitrary(g),
            u64_: u64::arbitrary(g),
            u32_: u32::arbitrary(g),
        }
    }
}

答案 1 :(得分:1)

common solution to this是使用仅在测试中定义的newtype

struct c_struct {
    pub i64_: i64,
    pub u64_: u64,
    pub u32_: u32,
}

#[cfg(test)]
mod test {
    struct ArbitraryCStruct(c_struct);

    impl quickcheck::Arbitrary for ArbitraryCStruct {
        fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> ArbitraryCStruct {
            ArbitraryCStruct(c_struct {
                i64_: i64::arbitrary(g),
                u64_: u64::arbitrary(g),
                u32_: u32::arbitrary(g),
            })
        }
    }
}

然后您可以在快速检查功能中接受此功能。如果需要,您可以使用.0提取值,或根据需要实施FromInto特征。