当测试模块移动到单独的文件时,宏未定义。

3

我正在编写一个宏的测试,我想要导出。只要我将测试保留在单个文件中,测试就可以正常工作,但是一旦我将测试模块放在一个单独的文件中,就会出现错误。

export/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提取到一个文件中,它就无法编译。

export/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!'
}

这让我出现了一个错误,提示宏未定义。

@LukasKalbertodt 这个似乎有 macro_export,而且宏在使用之前被导入了;能否帮我找到重复的部分? - Shepmaster
@Shepmaster 不用在意,是我自己的错误。可能有点累了;-) - Lukas Kalbertodt
1个回答

2

这里的问题在于你并没有编译你认为的东西。请检查一下:

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

当您运行时,它假定每个.rs文件都是要运行的测试。它不知道仅应作为另一个测试的一部分编译!
最简单的解决方案是将您的模块移动到其他有效模块位置,在单独的目录中:tests/my_test_mod/mod.rs。Cargo不会递归查找测试文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接