Files
whale-town-front/tests/unit/test_socketio_client.gd
WhaleTown Developer c8e73bec59 fix: 修复聊天系统编译错误
- 修复 WebSocketManager/SocketIOClient 函数缩进错误
- 重命名 is_connected() 避免与 Object 基类冲突
- 修复 tscn 文件多余前导空格
- 修复测试文件 GUT 断言函数调用
- 添加 GUT 测试框架
2026-01-08 00:11:12 +08:00

264 lines
8.4 KiB
GDScript

extends GutTest
# ============================================================================
# test_socketio_client.gd - SocketIOClient 单元测试
# ============================================================================
# 测试 Socket.IO 协议封装的功能
#
# 测试覆盖:
# - 初始化测试
# - 连接状态管理
# - 消息格式化
# - 事件监听器管理
# ============================================================================
var socket_client: SocketIOClient
# ============================================================================
# 测试设置和清理
# ============================================================================
func before_each():
# 每个测试前创建新实例
socket_client = SocketIOClient.new()
add_child(socket_client)
func after_each():
# 每个测试后清理
if is_instance_valid(socket_client):
socket_client.queue_free()
socket_client = null
# ============================================================================
# 初始化测试
# ============================================================================
func test_socket_initialization():
# 测试客户端初始化
assert_not_null(socket_client, "SocketIOClient 应该成功初始化")
assert_eq(socket_client.is_socket_connected(), false, "初始状态应该是未连接")
# ============================================================================
# 连接状态测试
# ============================================================================
func test_initial_connection_state():
# 测试初始连接状态为 DISCONNECTED
assert_eq(socket_client._connection_state, SocketIOClient.ConnectionState.DISCONNECTED,
"初始连接状态应该是 DISCONNECTED")
func test_get_connection_state_when_disconnected():
# 测试获取未连接状态
var state := socket_client._get_connection_state()
assert_eq(state, SocketIOClient.ConnectionState.DISCONNECTED,
"获取的连接状态应该是 DISCONNECTED")
# ============================================================================
# 事件监听器测试
# ============================================================================
func test_add_event_listener():
# 测试添加事件监听器
var callback_called := false
var test_callback := func(data: Dictionary):
callback_called = true
socket_client.add_event_listener("test_event", test_callback)
assert_true(socket_client._event_listeners.has("test_event"),
"事件监听器应该被添加")
assert_eq(socket_client._event_listeners["test_event"].size(), 1,
"应该有 1 个监听器")
func test_add_multiple_event_listeners():
# 测试添加多个监听器到同一事件
var callback1 := func(data: Dictionary): pass
var callback2 := func(data: Dictionary): pass
socket_client.add_event_listener("test_event", callback1)
socket_client.add_event_listener("test_event", callback2)
assert_eq(socket_client._event_listeners["test_event"].size(), 2,
"应该有 2 个监听器")
func test_remove_event_listener():
# 测试移除事件监听器
var callback := func(data: Dictionary): pass
socket_client.add_event_listener("test_event", callback)
assert_eq(socket_client._event_listeners["test_event"].size(), 1,
"监听器应该被添加")
socket_client.remove_event_listener("test_event", callback)
assert_eq(socket_client._event_listeners["test_event"].size(), 0,
"监听器应该被移除")
func test_remove_nonexistent_event_listener():
# 测试移除不存在的监听器不应该报错
var callback := func(data: Dictionary): pass
socket_client.remove_event_listener("nonexistent_event", callback)
# 如果没有报错,测试通过
assert_true(true, "移除不存在的监听器不应该报错")
# ============================================================================
# 消息格式化测试(模拟)
# ============================================================================
func test_message_data_structure():
# 测试消息数据结构
var message_data := {
"t": "chat",
"content": "Hello, world!",
"scope": "local"
}
# 验证数据结构
assert_true(message_data.has("t"), "消息应该有 't' 字段")
assert_eq(message_data["t"], "chat", "事件类型应该是 'chat'")
assert_eq(message_data["content"], "Hello, world!", "内容应该匹配")
assert_eq(message_data["scope"], "local", "范围应该是 'local'")
func test_login_message_structure():
# 测试登录消息数据结构
var login_data := {
"type": "login",
"token": "test_token_123"
}
# 验证数据结构
assert_true(login_data.has("type"), "登录消息应该有 'type' 字段")
assert_eq(login_data["type"], "login", "类型应该是 'login'")
assert_eq(login_data["token"], "test_token_123", "token 应该匹配")
func test_error_message_structure():
# 测试错误消息数据结构
var error_data := {
"t": "error",
"code": "AUTH_FAILED",
"message": "认证失败"
}
# 验证数据结构
assert_eq(error_data["t"], "error", "事件类型应该是 'error'")
assert_eq(error_data["code"], "AUTH_FAILED", "错误码应该匹配")
assert_eq(error_data["message"], "认证失败", "错误消息应该匹配")
# ============================================================================
# JSON 序列化测试
# ============================================================================
func test_json_serialization():
# 测试 JSON 序列化
var data := {
"t": "chat",
"content": "Test message",
"scope": "local"
}
var json_string := JSON.stringify(data)
var json := JSON.new()
var result := json.parse(json_string)
assert_eq(result, OK, "JSON 序列化应该成功")
assert_true(json.data.has("t"), "解析后的数据应该有 't' 字段")
assert_eq(json.data["content"], "Test message", "内容应该匹配")
func test_json_serialization_with_unicode():
# 测试包含 Unicode 字符的 JSON 序列化
var data := {
"t": "chat",
"content": "你好,世界!🎮",
"scope": "local"
}
var json_string := JSON.stringify(data)
var json := JSON.new()
var result := json.parse(json_string)
assert_eq(result, OK, "Unicode JSON 序列化应该成功")
assert_eq(json.data["content"], "你好,世界!🎮", "Unicode 内容应该匹配")
# ============================================================================
# 信号测试
# ============================================================================
func test_connected_signal():
# 测试连接成功信号
watch_signals(socket_client)
# 手动触发信号
socket_client.emit_signal("connected")
assert_signal_emitted(socket_client, "connected",
"应该发射 connected 信号")
func test_disconnected_signal():
# 测试断开连接信号
watch_signals(socket_client)
# 手动触发信号
socket_client.emit_signal("disconnected", true)
assert_signal_emitted(socket_client, "disconnected",
"应该发射 disconnected 信号")
func test_event_received_signal():
# 测试事件接收信号
watch_signals(socket_client)
var test_data := {"t": "test", "value": 123}
socket_client.emit_signal("event_received", "test", test_data)
assert_signal_emitted(socket_client, "event_received",
"应该发射 event_received 信号")
func test_error_occurred_signal():
# 测试错误发生信号
watch_signals(socket_client)
socket_client.emit_signal("error_occurred", "Test error")
assert_signal_emitted(socket_client, "error_occurred",
"应该发射 error_occurred 信号")
# ============================================================================
# 边界条件测试
# ============================================================================
func test_empty_message_content():
# 测试空消息内容
var data := {
"t": "chat",
"content": "",
"scope": "local"
}
assert_eq(data["content"], "", "空内容应该被保留")
func test_very_long_message_content():
# 测试超长消息内容(边界测试)
var long_content := "x".repeat(1000)
var data := {
"t": "chat",
"content": long_content,
"scope": "local"
}
assert_eq(data["content"].length(), 1000, "超长内容应该被保留")
func test_special_characters_in_message():
# 测试特殊字符
var data := {
"t": "chat",
"content": "Test with \"quotes\" and 'apostrophes'\n\tNew lines and tabs",
"scope": "local"
}
var json_string := JSON.stringify(data)
var json := JSON.new()
var result := json.parse(json_string)
assert_eq(result, OK, "特殊字符 JSON 序列化应该成功")
assert_true(json.data["content"].contains("\n"), "换行符应该被保留")