我正在创建一个简单的 HTTP 1.1 服务器,它将能够读取和写入新连接。一切似乎都在构建和运行良好,正如使用
print
语句来确认测试连接已建立一样。我想知道是否有一种方法可以测试 stream.read()
函数,该函数需要 mut buffer: [u8;1024]
。我想测试并查看程序是否正在等待通过终端的新连接。我目前正在使用 VSCode 和标准终端。
我会提供Server模块,我已经写好了。
use ::std::io::Read;
use std::net::TcpListener;
pub struct Server_Node {
address: String,
}
impl Server_Node {
pub fn new(address: String) -> Self {
Server_Node { address }
}
pub fn run(self) {
println!("Listening on {} !!!!凸(⊙▂⊙✖ )!!!!", self.address);
let listener = TcpListener::bind(&self.address).unwrap();
loop {
match listener.accept() {
Ok((mut _stream, _)) => {
let mut buffer = [0; 1024];
match _stream.read(&mut buffer) {
Ok(_) => {
println!("Recieved a request: {}", String::from_utf8_lossy(&buffer));
}
Err((e)) => println!("FAILED TO READ FVROM CONNECTION: {}", e),
}
}
Err(e) => println!("ERROR: FAILED TO ESTABLISH CONNECTION :{} ", e),
}
}
}
}
listener.accept()
返回一个实现 Read
特征的 TcpStream。 文档
如果您还没有研究过 Trait 和 Trait 对象,我建议您阅读 Rust book 中的内容。您可以编写一个单独的函数,该函数接受具有指定特征边界的通用参数。
match listener.accept() {
Ok((mut _stream, _)) => {
let mut buffer = [0; 1024];
match _stream.read(&mut buffer) {
Ok(_) => {
println!("Recieved a request: {}", String::from_utf8_lossy(&buffer));
}
Err((e)) => println!("FAILED TO READ FVROM CONNECTION: {}", e),
}
}
Err(e) => println!("ERROR: FAILED TO ESTABLISH CONNECTION :{} ", e),
}
你可以重写这样的内容:
fn process_stream<R: Read>(mut stream: R) -> Result<(), String> {
// process stream here
...
}
// Server_Node.run
match listener.accept() {
Ok((stream, _)) => process_stream(stream), // extend your logic
Err(err) => {...},
}
通过这样的分解,您可以使用单元测试覆盖您的process_stream函数并单独测试它,即使不运行整个应用程序。