用Rust进行单元测试

时间:2016-06-03 23:45:21

标签: rust

我创建了一个带有目录结构的小型数学库

mathslib - > src - > lib.rs - >转换/统计/ trig / bases

所有模块都声明为pub,函数也声明为pub

我只针对一个函数编写了以下测试,但是当我运行cargo test时,我遇到了一个错误,该函数无法解析(E0425)。

extern crate MathsLib;

use MathsLib::Conversions::Temperature;

#[cfg(test)]
mod TemperatureTests {
    #[test]
    fn test_kelvin_to_celcius_pass() {
         let calc = kelvin_to_celcius(14.5);
         assert_eq!(calc.0, true);
    }

    #[test]
    #[should_panic(expected = "assertion failed")]
    fn test_kelvin_to_celcius_fail() {
         let calc = kelvin_to_celcius(-4f32);
         assert_eq!(calc.0,true);
    }
}

从我从文档中可以看到,这应该没问题 - 但显然不是。

有问题的功能如下所示

pub fn kelvin_to_celcius(k: f32) -> (bool, f32)
{
    if k < 0f32
    {
        return (false, k);
    }
    else
    {
        return (true, k - 273.15);
    }
}

2 个答案:

答案 0 :(得分:2)

您的功能不在范围内。

假设您的模块布局如下:

pub fn kelvin_to_celcius(k: f32) -> (bool, f32)
{
    if k < 0f32
    {
        return (false, k);
    }
    else
    {
        return (true, k - 273.15);
    }
}

#[cfg(test)]
mod TemperatureTests {
    ...
}

然后,您需要将该功能纳入测试模块的范围。这样做的惯用方法是这样的:

#[cfg(test)]
mod TemperatureTests { 
    use super::*; // <--- use everything declared in the parent module
    ...
}

这允许封闭模块中的所有内容都可以在您的测试模块中使用而无需任何限定符。

或者,您可以将对方法的调用更改为:

let calc = super::kelvin_to_celcius(-4f32); // <-- note, "super" .. you want to go into the outer scope to find the method
 assert_eq!(calc.0,true);

答案 1 :(得分:1)

indexRoutereplace符号添加到模块的范围,但它不会在use MathsLib::Conversions::Temperature;模块中添加任何符号。如果你想这样做,你需要写这个:

Temperature