有没有办法在 Rust 中测试宏?
Is there a way to test macros in rust?
我正在尝试开始使用 Rust 中的 TDD,我需要编写一个宏,returns 枚举中的变体数量。我的实现类似于 this one:
extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
#[proc_macro_derive(EnumVariantCount)]
pub fn derive_enum_variant_count(input: TokenStream) -> TokenStream {
let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
let len = match syn_item.data {
syn::Data::Enum(enum_item) => enum_item.variants.len(),
_ => panic!("EnumVariantCount only works on Enums"),
};
let expanded = quote! {
const LENGTH: usize = #len;
};
expanded.into()
}
所以首先我想写一个测试来检查这个宏是否只适用于枚举。这将如何工作?我能以某种方式检查文件是否在单元测试中编译吗?是否有一些我忽略的关于测试 Rust 宏的文档?
trybuild
crate 是专门为此创建的:它编译一个测试文件,然后检查预期的编译时错误。
我正在尝试开始使用 Rust 中的 TDD,我需要编写一个宏,returns 枚举中的变体数量。我的实现类似于 this one:
extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
#[proc_macro_derive(EnumVariantCount)]
pub fn derive_enum_variant_count(input: TokenStream) -> TokenStream {
let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
let len = match syn_item.data {
syn::Data::Enum(enum_item) => enum_item.variants.len(),
_ => panic!("EnumVariantCount only works on Enums"),
};
let expanded = quote! {
const LENGTH: usize = #len;
};
expanded.into()
}
所以首先我想写一个测试来检查这个宏是否只适用于枚举。这将如何工作?我能以某种方式检查文件是否在单元测试中编译吗?是否有一些我忽略的关于测试 Rust 宏的文档?
trybuild
crate 是专门为此创建的:它编译一个测试文件,然后检查预期的编译时错误。