Импорт ящика основного пакета из справочника испытаний грузового пакета - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь увидеть, как написать модульные тесты для исполняемого файла ржавчины, которые находятся не в модуле того же файла, а в каталоге tests/ рядом с src/, сгенерированным Cargo.В настоящее время это мой каталог установки

hello_cargo
        |
        src
          |
           main.rs
           value.rs
        tests
            |
             tests.rs

Содержимое value.rs:

#[derive(Debug)]
pub enum Value {
    Int(i32),
    Bool(bool)
}

Содержимое main.rs

mod value;

use value::Value;

fn main() {
    let x:Value = Value::Int(7);
    let y = Value::Bool(true);

    match x {
        Value::Int(ival) => println!("{}", ival),
        Value::Bool(bval) => println!("{}", bval)
    }

    match y {
        Value::Int(ival) => println!("{}", ival),
        Value::Bool(bval) => println!("{}", bval)
    }
}

Содержимое tests.rs

#[cfg(test)]
mod tests {
    use super::hello_cargo;
    #[test]
    fn it_works() {
        let y = value::Value::Bool(true);
        match y {
            value::Value::Bool(val) => assert!(val),
            _ => ()
        }
    }
}

Когда я запускаю cargo test, я всегда получаю, с несколькими различными use:: комбинациями

error[E0432]: unresolved import `super::hello_cargo`
 --> tests/tests.rs:5:6
  |
5 |     use super::hello_cargo;
  |         ^^^^^^^^^^^^^^^^^^ no `hello_cargo` in the root

Разве невозможно сделать это с исполняемыми файлами?Вам нужна библиотека, чтобы иметь тесты во внешнем каталоге тестов?

Будет ли это решено путем упаковки всего кода в каждом файле в mod?

1 Ответ

0 голосов
/ 01 мая 2019

Я разобрался с кодом ниже в tests/ dir

use hello_cargo;

// This needs to be in the /tests/ dir beside /src/
// the above `use` must match the name of the crate itself.

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        let y = hello_cargo::value::Value::Bool(true);
        match y {
            hello_cargo::value::Value::Bool(val) => assert!(val),
            _ => ()
        }
    }

}

Оператор use должен быть просто именем ящика, который создает текущий пакет, без префикса super или self

...