rust 从位于“tests”目录下的集成测试文件导入在“src”目录中定义的函数

f0brbegy  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(181)

我在导入add_two.rs中定义的公共add_two函数时遇到了麻烦。这是我的项目结构。

Cargo.toml
src/
    main.rs
    add_two.rs
tests/
    integration_test.rs

下面是我的main.rs文件,它定义了main函数。

//binary crate: it contains main function

pub mod add_two; 

#[cfg(test)]
mod tests {
    use crate::add_two::add_two; 

    #[test]
    fn add_two_and_two(){
        assert_eq!(4, add_two(2)); 
    }
    #[test]
    fn add_three_and_two(){
        assert_eq!(5, add_two(3)); 
    }
    #[test]
    fn one_hundred(){
        assert_eq!(102, add_two(100)); 
    }
    #[test]
    #[ignore]
    fn test_we_want_to_ignore() {
        //snippet of code that takes too much processing time! 
    }
}

fn main() {

}

这是我的add_two.rs文件。

//library crate 

pub fn add_two(a: i32) -> i32 {
    a + 2
}

下面是我的integration_test.rs文件。

use crate::add_two::add_two; 

#[test]
fn add_two_with_two() {
    assert_eq!(add_two(2), 4); 
}

这是我的货物,toml文件.

[package]
name = "tutorial1"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
ikfrs5lh

ikfrs5lh1#

集成测试用于测试库。它们的工作方式就好像它们是另一个包,它依赖于你的包。
您的包只有一个二进制crate,因此集成测试唯一能做的就是运行编译后的二进制文件。但是,您可以重新构造代码,以便测试能够正常工作。
首先,您需要一个src/lib.rs文件。这是图书馆的入口。

// lib.rs

pub mod add_two;

然后,在集成测试中,通过包的名称引用库crate。

use tutorial1::add_two::add_two; 

#[test]
fn add_two_with_two() {
    assert_eq!(add_two(2), 4); 
}

这将按预期工作,但您还应该清理main.rs,以便它也取决于您的库入口点。这样可以避免代码被不必要地编译两次。

// main.rs

use tutorial1::add_two;
// instead of `mod add_two;`

将测试移到add_two.rs中也是明智的,因为它们只与该模块相关。这也将确保在测试库时运行它们。
相关内容:

相关问题