从货物包装的测试目录导入主包装箱

时间:2019-04-30 22:07:04

标签: rust rust-cargo

我试图查看如何为不在同一文件模块中,而是在由货物生成的tests/旁边的src/目录中的rust可执行文件编写单元测试。目前,这是我的目录设置

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 :(得分:0)

我在tests/目录中找到了下面的代码

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语句必须只是当前程序包产生的板条箱名称,而没有任何superself前缀