Rust 单元测试函数需要做什么处理吗?

报错:

image.png

代码:


use std::fs;
#[test] //去掉这个函数将是对的
#[allow(dead_code)]
#[allow(unused_must_use)]
fn checkname() -> String {
    let isempty = fs::read_dir("h:/image/PracticeBlender/")
        .unwrap()
        .next()
        .is_none();
    if isempty {
        return "2".to_string();
    }
    fs::read_dir("h:/image/PracticeBlender/")
        .unwrap()
        .into_iter()
        .map(|x| {
            x.map(|entry| {
                println!("2");
                let file_name = entry.file_name();
                println!("{:?}", file_name);
            })
        });
    "1".to_string()
}
阅读 2.5k
2 个回答

加入#[test]标签的函数,rust会将其做为测试用例。

执行测试时,每个测试函数都会放到一个独立的运行空间中当做main函数来执行,而mian函数要求返回值必须满足Termination特性(trait)。

你这里给checkname加上#[test]后,编译器将checkname做为main函数来运行测试时,发现main函数返回了String类型,而String不满足Termination特性(trait),所以会报错。正确做法是用于单元测试的函数,不要有返回值。

另外,rust中的单元测试有一些常用惯例,请参考这本书:https://kaisery.github.io/trp... 第11章内容。

也许测试应该这样用

#[cfg(test)]
mod tests {
    use std::fs;

    #[allow(dead_code)]
    #[allow(unused_must_use)]
    fn checkname() -> String {
        let isempty = fs::read_dir("h:/image/PracticeBlender/")
            .unwrap()
            .next()
            .is_none();
        if isempty {
            return "2".to_string();
        }
        fs::read_dir("h:/image/PracticeBlender/")
            .unwrap()
            .into_iter()
            .map(|x| {
                x.map(|entry| {
                    println!("2");
                    let file_name = entry.file_name();
                    println!("{:?}", file_name);
                })
            });
        "1".to_string()
    }

    #[test]
    fn test_checkname() {
        assert_eq!("1".to_string(), checkname());
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏