英文:
How to access the connection status of an awc websocket client?
问题
我已经设置了一个基本的Actix Web服务器,并且成功地在我的测试中使用`awc::client::Client`创建了WebSocket连接。
现在我正在尝试测试当我告诉服务器重置应用程序的状态时,它是否关闭了所有的WebSocket连接。
我目前计划的测试如下:
```rs
#[test]
async fn reset_game_works_basic() {
let server: TestServer = test_fixtures::get_test_server();
let (_resp, mut chris_connection) = Client::new()
.ws(server.url("/join-game?username=Chris"))
.connect()
.await
.unwrap();
let _ = server.post("/reset-game").send().await;
let websocket_connected = chris_connection.websocket_connected_status();
// ^^^^ 不是一个真实的函数
assert_eq!(websocket_connected, false);
}
从awc websocket文档中,我只能找到一个CloseCode
枚举,但那似乎是用于客户端告诉服务器它为什么关闭连接。
我还试图使用is_write_ready()
检查连接是否仍然打开,但它返回了true
。
我已经用Postman进行了手动测试,当你向/reset-game
发送POST请求时,客户端会被断开连接。
我应该如何询问客户端它是否仍然保持着开放的连接?
<details>
<summary>英文:</summary>
I have a basic Actix Web server set up, and I have successfully been creating websocket connections in my tests using `awc::client::Client`.
Now I am trying to test that my server is closing all of the websocket connections when I tell it reset the status of the app.
My current planned test for this is:
```rs
#[test]
async fn reset_game_works_basic() {
let server: TestServer = test_fixtures::get_test_server();
let (_resp, mut chris_connection) = Client::new()
.ws(server.url("/join-game?username=Chris"))
.connect()
.await
.unwrap();
let _ = server.post("/reset-game").send().await;
let websocket_connected = chris_connection.websocket_connected_status();
// ^^^^ Not a real function
assert_eq!(websocket_connected, false);
}
From the awc websocket docs, I have only been able to find a CloseCode
enum, but that seems to be used for the client to tell the server why it is closing the connection.
I also fruitlessly tried to check if the connection was open by using is_write_ready()
, but that returned true
.
I have done manual testing with Postman, and the clients are being disconnected when you send a post request to /reset-game
.
How should I ask the client if it still has an open connection?
答案1
得分: 0
当WebSocket连接关闭时,.next().await
将返回None
,当它处于打开状态时,它将返回Some
,即使没有下一条消息!
所以,这个测试在工作代码的情况下成功通过,并且如果我移除实际关闭WebSocket的代码,测试就会失败!
#[test]
async fn reset_game_works_basic() {
let server: TestServer = test_fixtures::get_test_server();
let (_resp, mut chris_connection) = Client::new()
.ws(server.url("/join-game?username=Chris"))
.connect()
.await
.unwrap();
let _ = server.post("/reset-game").send().await;
let _join = chris_connection.next().await;
let no_message = chris_connection.next().await;
let websocket_disconnected = no_message.is_none();
assert_eq!(websocket_disconnected, true);
}
这显然对问题很脆弱,如果在断开连接之前使WebSocket发送第二条消息,它就会出问题,但这是我尝试在这里解决的问题之外的另一个问题。
英文:
I ended up finding a working (albiet fragile) test for this.
When the websocket connection is closed, .next().await
will return None
, and when it is open, it will return Some
, even if there is no next message!
So this test successfully passes with the working code, and fails if I remove the code that actually closes the websocket!
#[test]
async fn reset_game_works_basic() {
let server: TestServer = test_fixtures::get_test_server();
let (_resp, mut chris_connection) = Client::new()
.ws(server.url("/join-game?username=Chris"))
.connect()
.await
.unwrap();
let _ = server.post("/reset-game").send().await;
let _join = chris_connection.next().await;
let no_message = chris_connection.next().await;
let websocket_disconnected = no_message.is_none();
assert_eq!(websocket_disconnected, true);
}
It certainly is fragile to the problem that if I make the websocket send a second message before disconnecting it will break, but that is a separate problem to the one I was trying to solve here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论