gpt4 book ai didi

unit-testing - 如何在 Rust 宏中使用 ty

转载 作者:行者123 更新时间:2023-11-29 07:53:51 25 4
gpt4 key购买 nike

我正在尝试编写一个通用解决方案来为单元测试 Rust 代码提供固定装置。我想出了一个宏,它允许用户定义setupteardown 方法。到目前为止,这是我的解决方案:

struct FooTestFixture {
pub name : String
}

impl FooTestFixture {
fn setup() -> FooTestFixture {
FooTestFixture { name: String::from("Initialised") }
}
}

fn teardown(fixture : &mut FooTestFixture) {
fixture.name = "".to_string();
}

macro_rules! unit_test {
($name:ident $fixt:ident $expr:expr) => (
#[test]
fn $name() {
let mut $fixt : FooTestFixture = FooTestFixture::setup();
$expr;

teardown(&mut $fixt);
}
)
}

unit_test! (heap_foo_fixture_should_be_initialised_using_macro f {
assert_eq!(f.name, "Initialised");
});

这行得通。唯一的问题是,宏 unit_test 不是通用的,并且绑定(bind)到夹具名称 FooTestFixture。这意味着每个测试模块都需要为每个测试夹具重新定义这个宏,这是不理想的。我希望能够做的是还引入一个类型变量并在宏扩展中使用该类型。深入研究宏,我发现有一个“ty”项目,它代表一种类型,我想我可以做到这一点......

macro_rules! unit_test {
($name:ident $fixt:ident $ftype:ty $expr:expr) => (
#[test]
fn $name() {
let mut $fixt : $ftype = $ftype::setup();
$expr;

teardown(&mut $fixt);
}
)
}

unit_test! (heap_foo_fixture_should_be_initialised_using_macro FooTestFixture f {
assert_eq!(f.name, "Initialised");
});

但是,这不起作用并导致以下错误:

src\tests\heap_fixture_with_new.rs:48:40: 48:50 error: $ftype:ty is followed by $expr:expr, which is not allowed for ty fragments src\tests\heap_fixture_with_new.rs:48 ($name:ident $fixt:ident $ftype:ty $expr:expr) => (

如您所见,在宏定义中,我已将对 FooTestFixture 的引用替换为 $ftype。

我想要实现的目标可行吗?这几乎就像我希望宏是通用的,允许您传入一个类型,以便在宏定义中使用。

最佳答案

好吧,我意识到我根本不需要ty。我可以将类型指定为 ident 参数,这样下面的代码就可以工作了:

macro_rules! unit_test {
($name:ident $fixt:ident $ftype:ident $expr:expr) => (
#[test]
fn $name() {
let mut $fixt = $ftype::setup();
$expr;

teardown(&mut $fixt);
}
)
}

unit_test! (foo_fixture_should_be_initialised_using_generic_macro f FooTestFixture {
assert_eq!(f.name, "Initialised");
});

关于unit-testing - 如何在 Rust 宏中使用 ty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37058836/

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