如何使用异步无限循环测试方法?
How to test a method with an asynchronous infinite loop?
我有一个作为服务器应用程序的 postmaster 的结构:因为我不知道有多少客户端将连接,所以我让 postmaster 侦听一个套接字,并在客户端打开时启动一个具有业务逻辑的新结构一个连接。
但这意味着我不知道如何为 Postmaster 实施集成测试。有一个 public “主要”方法在等待连接时无限期挂起:
#[tokio::main]
pub async fn start(self) -> Result<(), GenericError> {
//
let mut this = self;
loop {
let tmp = this.configuration.clone().hostaddr();
println!("{:?}", tmp);
let listener = TcpListener::bind(tmp).await?;
match listener.accept().await {
Ok((stream, _addr)) => {
let backend = Backend::new(&this.configuration, stream);
this.backends.push(backend);
}
Err(e) => todo!("Log error accepting client connection."),
}
}
Ok(())
}
这是我的测试:
#[test]
fn test_server_default_configuration() {
let postmaster = Postmaster::default();
let started = postmaster.start();
assert!(started.is_ok())
}
除了显然从未达到断言。我如何测试这个异步代码?
您可以在单独的线程中启动 postmaster,连接到它,给它一些命令,然后检查响应:
#[test]
fn test_server_default_configuration() {
let postmaster = Postmaster::default();
let thr = std::thread::spawn(move || postmaster.start());
// connect to the configured address, test the responses...
// ...
// finally, send the postmaster a "quit" command
let result = thr.join().unwrap();
assert!(result.is_ok())
}
我有一个作为服务器应用程序的 postmaster 的结构:因为我不知道有多少客户端将连接,所以我让 postmaster 侦听一个套接字,并在客户端打开时启动一个具有业务逻辑的新结构一个连接。
但这意味着我不知道如何为 Postmaster 实施集成测试。有一个 public “主要”方法在等待连接时无限期挂起:
#[tokio::main]
pub async fn start(self) -> Result<(), GenericError> {
//
let mut this = self;
loop {
let tmp = this.configuration.clone().hostaddr();
println!("{:?}", tmp);
let listener = TcpListener::bind(tmp).await?;
match listener.accept().await {
Ok((stream, _addr)) => {
let backend = Backend::new(&this.configuration, stream);
this.backends.push(backend);
}
Err(e) => todo!("Log error accepting client connection."),
}
}
Ok(())
}
这是我的测试:
#[test]
fn test_server_default_configuration() {
let postmaster = Postmaster::default();
let started = postmaster.start();
assert!(started.is_ok())
}
除了显然从未达到断言。我如何测试这个异步代码?
您可以在单独的线程中启动 postmaster,连接到它,给它一些命令,然后检查响应:
#[test]
fn test_server_default_configuration() {
let postmaster = Postmaster::default();
let thr = std::thread::spawn(move || postmaster.start());
// connect to the configured address, test the responses...
// ...
// finally, send the postmaster a "quit" command
let result = thr.join().unwrap();
assert!(result.is_ok())
}