2017-02-14 7 views
3

Я пишу тест для макроса, который хочу экспортировать. Тест работает до тех пор, пока я сохраняю свои тесты в одном файле, но как только я поместил модуль тестов в отдельный файл, я получаю сообщение об ошибке.Macro undefined, когда тестовый модуль перемещается в отдельный файл

экспорт/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) 
    } 
} 

экспорт/тесты/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

Неизменённые

экспорт/тесты/lib.rs

#[macro_use] 
extern crate export; 

mod my_test_mod; 

экспорт/тесты/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!' 
} 

Это дает мне ошибку, что макрос не определен.

+0

@LukasKalbertodt У этого объекта, похоже, есть макрос_экспорт и макрос импортируется до его использования; ум, соединяющий точки с дубликатом для меня? – Shepmaster

+0

@Shepmaster Nevermind, моя ошибка. Был уставшим ;-) –

ответ

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 ...` 

При запуске cargo test, предполагается, что каждый .rs файл тест для запуска. Он не знает, что my_test_mod.rs должен компилироваться только как часть другого теста!

Самое простое решение - перенести ваш модуль на другое допустимое местоположение модуля в отдельном каталоге: tests/my_test_mod/mod.rs. Cargo не будет рекурсивно просматривать каталог для тестовых файлов.