我正在使用宏来生成测试。想象一个简单的定义,像这样:
macro_rules! my_test {
($name:ident) => {
#[test]
fn $name() {
assert_eq!(6, 3 + 3);
}
};
}
我想禁用以这种方式生成的一些测试:
my_test!(good_test_a);
my_test!(good_test_b);
#[ignore]
my_test!(bad_test_a);
#[ignore]
my_test!(bad_test_b);
但是,根据native interfaces,
扩展宏时,会删除应用于宏调用的属性。
事实上,所有测试都在运行;没有人会被忽略。 (请参见this GitHub issue。)
有没有针对此限制的实际解决方法?也许还有其他方法可以调用宏,以允许将#[ignore]
属性应用于其扩展吗?
答案 0 :(得分:3)
此限制是否有实用的解决方法?
是的。通过允许宏本身通过meta
macro fragment接受属性,您可以解决以下问题:
#![cfg(test)]
macro_rules! my_test {
($(#[$m:meta])* // This accepts `#[foo] #[bar(..)] ..`
$name:ident) => {
$(#[$m])* // This expands the attributes.
#[test]
fn $name() {
assert_eq!(6, 3 + 3);
}
};
}
my_test!(good_test_a);
my_test!(good_test_b);
// You can pass in `#[ignore]` or any series of attributes you wish:
my_test!(#[ignore] bad_test_a);
my_test!(#[ignore] bad_test_b);
运行此命令,我们得到:
running 4 tests
test bad_test_a ... ignored
test bad_test_b ... ignored
test good_test_a ... ok
test good_test_b ... ok
test result: ok. 2 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out