Unit testing 在tests/test.rs文件中无法识别src/main.rs中定义的类型

Unit testing 在tests/test.rs文件中无法识别src/main.rs中定义的类型,unit-testing,testing,rust,Unit Testing,Testing,Rust,我试图在rust中编写单元测试,但在运行cargo test时,出现以下错误: “使用未声明的类型额定值”。 在src/main.rs文件中,我定义了如下结构评级: #[derive(PartialEq, Debug, Clone, Copy)] struct Rating(i8); impl Rating { pub fn new(value: i32) -> Result <Rating, CreationError> { match value

我试图在rust中编写单元测试,但在运行cargo test时,出现以下错误: “使用未声明的类型额定值”。 在src/main.rs文件中,我定义了如下结构评级:

#[derive(PartialEq, Debug, Clone, Copy)]
struct Rating(i8);

impl Rating {
    pub fn new(value: i32) -> Result <Rating, CreationError> {
        match value {
            v if v > 10 => Err(CreationError::PosOverflow),
            v if v < -10 => Err(CreationError::NegOverflow),
            _ => Ok(Rating(value as i8)),
        }

    }
}
#[cfg(test)]
fn create_new_rating() {
    assert_eq!(Rating::new(10).0, 10);
}

在Rust文档中,我只找到了测试libs而不是二进制的示例。在这种情况下,我必须使用不同的语法吗?

您的
tests
文件夹用于集成测试,需要像使用外部用户一样使用您的板条箱。将
使用mycratename::Rating
添加到test.rs的顶部,并公开评级

如果这是一个单元测试(看起来像),那么将测试放在与代码相同的文件中是惯用的做法。这在中进行了描述。你会得到这样的结果:

#[派生(部分查询、调试、克隆、复制)]
结构等级(i8);
impl评级{
pub fn new(值:i32)->结果{
匹配值{
如果v>10=>Err(CreationError::PosOverflow),
如果v<-10=>错误(CreationError::NegOverflow),
_=>正常(额定值(值为i8)),
}
}
}
#[cfg(测试)]
模试验{
使用超级::*;
#[测试]
fn创建新的评级(){
assert_eq!(评级:新(10.0,10);
}
}

谢谢!单元测试方法是有效的。我还尝试使用MyName::Rating;虽然我做了评级,但我还是犯了同样的错误。mycratename是src的父文件夹,分别测试my Cargo.toml文件中的name字段,对吗?是的,mycratename应该替换为您提到的名称。我不知道为什么它不起作用。如果你在铁锈书的链接章节中向下滚动一点到,你会看到一个可以比较的示例的实际需求。集成测试是测试库,而不是二进制文件。也就是说,它们指的是
lib.rs
,而不是
main.rs