gpt4 book ai didi

unit-testing - 单元测试 Rust Syn crate

转载 作者:行者123 更新时间:2023-12-03 11:44:15 26 4
gpt4 key购买 nike

来自 Syn documentation :

Syn operates on the token representation provided by the proc-macro2 crate from crates.io rather than using the compiler's built in proc-macro crate directly. This enables code using Syn to execute outside of the context of a procedural macro, such as in unit tests or build.rs


我正在尝试为某些 Syn 功能启用单元测试,但是无论我尝试了什么,我都无法让它工作。它不适用于 proc_macro2::TokenStream类型,但它不适用于 proc_macro::TokenStream因为我们不在 proc-macro 上下文中。
link to playground
use quote::quote;
use syn;

fn test() {
// let stream: syn::export::TokenStream = quote!{fn foo() {};}.into(); // doesn't work
let stream: proc_macro2::TokenStream = quote!{fn foo() {};}.into(); // doesn't work
// let item = parse_macro_input!(stream as Item); // doesn't work
let item = syn::parse(stream).unwrap();

}

fn main() {
test();
}

任何有关如何在 proc-macro 上下文之外测试 syn 函数的帮助将不胜感激。我知道 trybuild crate ,但我希望能够先对宏的功能进行单元测试。

最佳答案

It does not work with the proc_macro2::TokenStream type, but it won't work with the proc_macro::TokenStream because we are not in a proc-macro context.


是的,这就是重点!导出过程宏的 crates 不能导出任何其他内容,但 proc_macro只能在导出宏的 crate 中使用。这就是为什么 proc_macro2首先存在。
您需要使用多个 crate 才能为使用 syn 的代码编写测试。和 proc_macro2 :
  • #[proc_macro] 声明宏的公共(public) crate等等,除了转换 proc_macro::TokenStream变成 proc_macro2::TokenStream反之亦然。
  • 一个“内部”包,包含大部分实际代码,取决于 proc_macro2但不是 proc_macro .你的测试可以在这里进行。

  • 您看到的错误是因为 syn::parse接受 proc_macro::TokenStream .您可以改用 syn::parse2 , 除了接受 proc_macro2::TokenStream .

    关于unit-testing - 单元测试 Rust Syn crate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65269173/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com