rui*_*eco 2 struct unit-testing rust
我有以下内容struct:
pub struct Settings {
pub something: String
}
Run Code Online (Sandbox Code Playgroud)
使用以下构造函数:
impl Settings {
fn new(path: &Path) -> Settings {
if !path.exists() {
fail!("Configuration file not found.");
}
return Settings{something:String::new()};
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个单元测试,看看当我创建一个Paths指向现有文件和没有现有文件的结构时会发生什么:
mod tests {
#[test]
fn test_new_valid_path() {
use configuration::Settings;
let path = &Path::new("emperor.ini");
let settings = Settings::new(path);
assert!(settings);
}
#[test]
fn test_new_invalid_path() {
use configuration::Settings;
let path = &Path::new("emperor.xml");
let settings = Settings::new(path);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的测试时:rustc --test meh.rs; ./meh --nocapture我得到以下输出:
<std macros>:3:12: 40:20 error: cannot apply unary operator `!` to type `configuration::Settings`
<std macros>:3 if !$cond {
<std macros>:4 fail!("assertion failed: {:s}", stringify!($cond))
<std macros>:5 }
<std macros>:6 );
<std macros>:7 ($cond:expr, $($arg:expr),+) => (
<std macros>:8 if !$cond {
...
<std macros>:1:1: 12:2 note: in expansion of assert!
shogun.rs:40:4: 40:22 note: expansion site
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
我如何测试struct实例化?
我认为你误解了这些东西如何运作的模型.
返回类型为Settings-well的函数,返回时的值Settings是保证正确实例化的对象.如果我们删除了您的assert!(settings);行,代码将完全按照您的要求执行.(assert!顺便说一下,期望布尔值作为它的第一个参数,就像if需要一个布尔表达式一样.)
如果路径是不存在的路径,则会fail!发挥作用,任务将失败,展开; 的Settings::new通话永远不会返回.触发任务失败也正是assert!(…)如此.
换句话说:执行该行的事实证明它是正确初始化的.
顺便说一句,这样的失败通常被认为是不好的形式; 更好的是返回一个Option<Settings>,而不是使用名称new,而是指示你将从文件中加载它的东西; 这样的事情:
impl Settings {
fn load(path: &Path) -> Option<Settings> {
if !path.exists() {
None
} else {
Some(Settings { something: String::new() })
}
}
}
Run Code Online (Sandbox Code Playgroud)