gpt4 book ai didi

testing - 将测试模块移动到单独的文件时未定义宏

转载 作者:行者123 更新时间:2023-11-29 08:00:28 24 4
gpt4 key购买 nike

我正在为要导出的宏编写测试。只要我将测试保存在一个文件中,该测试就可以正常工作,但是一旦我将测试模块放在一个单独的文件中,我就会收到错误消息。

导出/src/lib.rs

pub mod my_mod {
#[macro_export]
macro_rules! my_macro {
( $x:expr ) => { $x + 1 };
}

pub fn my_func(x: isize) -> isize {
my_macro!(x)
}
}

export/tests/lib.rs

#[macro_use]
extern crate export;

mod my_test_mod {
use export::my_mod;

#[test]
fn test_func() {
assert_eq!(my_mod::my_func(1), 2);
}

#[test]
fn test_macro() {
assert_eq!(my_macro!(1), 2);
}
}

运行 cargo test 表示两个测试都通过了。如果我将 my_test_mod 提取到一个文件,它将不再编译。

导出/src/lib.rs

不变

export/tests/lib.rs

#[macro_use]
extern crate export;

mod my_test_mod;

export/tests/my_test_mod.rs

use export::my_mod;

#[test]
fn test_func() {
assert_eq!(my_mod::my_func(1), 2);
}

#[test]
fn test_macro() {
assert_eq!(my_macro!(1), 2); // error: macro undefined: 'my_macro!'
}

这给我一个宏未定义的错误。

最佳答案

这里的问题是您没有编译您认为正在编译的东西。检查一下:

$ cargo test --verbose
Compiling export v0.1.0 (file:///private/tmp/export)
Running `rustc --crate-name my_test_mod tests/my_test_mod.rs ...`

当您运行 cargo test 时,它假定每个 .rs 文件都是要运行的测试。它不知道 my_test_mod.rs 应该只作为另一个测试的一部分进行编译!

最简单的解决方案是将您的模块移动到另一个有效的模块位置,在一个单独的目录中:tests/my_test_mod/mod.rs。 Cargo 不会递归地在目录中查找测试文件。

关于testing - 将测试模块移动到单独的文件时未定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42215714/

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