How do I assert an enum is a specific variant if I don't care about its fields?

后端 未结 3 1210
情话喂你
情话喂你 2021-01-11 09:42

I\'d like to check enums with fields in tests while ignoring the actual value of the fields for now.

Consider the following example:

enum MyEnum {
           


        
3条回答
  •  逝去的感伤
    2021-01-11 10:39

    Rust 1.42

    You can use std::matches:

    assert!(matches!(return_with_fields(), MyEnum::WithFields { .. }));
    

    Previous versions

    Your original code can be made to work with a new macro:

    macro_rules! is_enum_variant {
        ($v:expr, $p:pat) => (
            if let $p = $v { true } else { false }
        );
    }
    
    #[test]
    fn example() {
        assert!(is_enum_variant!(return_with_fields(), MyEnum::WithoutFields {..}));
    }
    

    Personally, I tend to add methods to my enums:

    fn is_with_fields(&self) -> bool {
        match self {
            MyEnum::WithFields { .. } => true,
            _ => false,
        }
    }
    

    I also tend to avoid struct-like enums and instead put in extra work:

    enum MyEnum {
        WithoutFields,
        WithFields(WithFields),
    }
    
    struct WithFields { field: String }
    
    impl MyEnum {
        fn is_with_fields(&self) -> bool {
            match self {
                MyEnum::WithFields(_) => true,
                _ => false,
            }
        }
    
        fn as_with_fields(&self) -> Option<&WithFields> {
            match self {
                MyEnum::WithFields(x) => Some(x),
                _ => None,
            }
        }
        
        fn into_with_fields(self) -> Option {
            match self {
                MyEnum::WithFields(x) => Some(x),
                _ => None,
            }
        }
    }
    

    I hope that some day, enum variants can be made into their own type to avoid this extra struct.

提交回复
热议问题