我目前正在使用 Rust 编写一个 REST Web 服务器。
我正在使用“reqwest”来测试 REST API。为了运行这些测试,我需要运行一个服务器实例。
如果我在运行“cargo test”之前启动它,cargo 会失败,因为它可以覆盖二进制文件(在 Windows 上)
所以,我尝试过:
对于1),我找到了几个解决方案(test_env_helpers,Once,...) 但对于2),我还没有找到解决方案。我试过了:
有什么建议吗?
一种解决方案是使用集成测试。它们与服务器二进制文件分开编译并可以访问服务器二进制文件。不过,您有责任找出二进制文件的路径。
// tests/test_server.rs
use std::io::{BufRead, BufReader};
use std::process::{Command, Stdio};
pub fn test_server() {
let mut path = std::env::current_exe().unwrap();
assert!(path.pop());
if path.ends_with("deps") {
assert!(path.pop());
}
// Note: Cargo automatically builds this binary for integration tests.
path.push(format!("{}{}", env!("CARGO_PKG_NAME"), std::env::consts::EXE_SUFFIX));
let mut cmd = Command::new(path);
cmd.env_clear();
cmd.stdin(Stdio::piped());
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::piped());
// TODO: cmd.args([]);
let mut server = cmd.spawn().unwrap();
let stdout = server.stdout.take().unwrap();
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
while let Some(Ok(line)) = lines.next() {
// TODO: Server needs to print "listening" to stdout
if line.contains("listening") {
break;
}
}
// TODO: Run tests.
}