Where should I put test utility functions in Rust?

2020-02-28 06:26发布

问题:

I have the following code defining a path where generated files can be placed:

fn gen_test_dir() -> tempdir::TempDir {                                        
    tempdir::TempDir::new_in(Path::new("/tmp"), "filesyncer-tests").unwrap()   
} 

This function is defined in tests/lib.rs, used in the tests in that file and I would also like to use it in the unit tests located in src/lib.rs.

Is this possible to achieve without compiling the utility functions into the non-test binary and without duplicating code?

回答1:

What I do is put my unit tests with any other utilities into a submodule protected with #[cfg(test)]:

#[cfg(test)]
mod tests {  // The contents could be a separate file if it helps organisation
    // Not a test, but available to tests.
    fn some_utility(s: String) -> u32 {
        ...
    }

    #[test]
    fn test_foo() {
        assert_eq!(...);
    }
    // more tests
}


回答2:

You can import from your #[cfg(test)] modules from other #[cfg(test)] modules, so, for example, in main.rs or in some other module, you can do something like:

#[cfg(test)]
pub mod test_util {
    pub fn return_two() -> usize { 2 }
}

and then from anywhere else in your project:

#[cfg(test)]
mod test {
    use crate::test_util::return_two;

    #[test]
    fn test_return_two() {
        assert_eq!(return_two(), 2);
    }
}