147 lines
6.2 KiB
Python
147 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
测试发送给客户端的数据结构
|
||
模拟服务器发送给客户端的数据格式
|
||
"""
|
||
|
||
import json
|
||
from SMYMongoDBAPI import SMYMongoDBAPI
|
||
|
||
def test_client_data_format():
|
||
"""测试发送给客户端的数据格式"""
|
||
print("=== 测试客户端数据格式 ===")
|
||
|
||
try:
|
||
# 初始化MongoDB API
|
||
mongo_api = SMYMongoDBAPI("test")
|
||
|
||
if not mongo_api.is_connected():
|
||
print("❌ MongoDB连接失败")
|
||
return
|
||
|
||
print("✅ MongoDB连接成功")
|
||
|
||
# 模拟_load_crop_data方法
|
||
print("\n=== 测试作物数据 ===")
|
||
crop_data = mongo_api.get_crop_data_config()
|
||
|
||
if crop_data:
|
||
# 模拟服务器发送的crop_data_message
|
||
crop_data_message = {
|
||
"type": "crop_data_response",
|
||
"success": True,
|
||
"crop_data": crop_data
|
||
}
|
||
|
||
print(f"作物数据类型: {type(crop_data)}")
|
||
print(f"作物数据键数量: {len(crop_data)}")
|
||
|
||
# 检查是否有config_type字段
|
||
if 'config_type' in crop_data:
|
||
print(f"⚠️ 作物数据包含config_type: {crop_data['config_type']}")
|
||
else:
|
||
print("✅ 作物数据不包含config_type字段")
|
||
|
||
# 检查前几个作物的数据结构
|
||
crop_count = 0
|
||
for crop_name, crop_info in crop_data.items():
|
||
if crop_name not in ['_id', 'config_type'] and crop_count < 3:
|
||
print(f"\n作物 {crop_name}:")
|
||
print(f" 数据类型: {type(crop_info)}")
|
||
|
||
if isinstance(crop_info, dict):
|
||
# 检查关键字段
|
||
key_fields = ['能否购买', '品质', '等级', '作物名称']
|
||
for key in key_fields:
|
||
if key in crop_info:
|
||
value = crop_info[key]
|
||
print(f" {key}: {value} (类型: {type(value)})")
|
||
|
||
# 特别检查能否购买字段
|
||
if key == '能否购买':
|
||
if isinstance(value, str):
|
||
print(f" ⚠️ '能否购买'字段是字符串,这会导致Godot报错!")
|
||
elif isinstance(value, bool):
|
||
print(f" ✅ '能否购买'字段是布尔值,正确")
|
||
elif isinstance(crop_info, str):
|
||
print(f" ⚠️ 整个作物数据是字符串: '{crop_info[:50]}...'")
|
||
print(f" 这会导致Godot调用.get()方法时报错!")
|
||
|
||
crop_count += 1
|
||
|
||
# 保存作物数据到文件以便检查
|
||
with open('crop_data_debug.json', 'w', encoding='utf-8') as f:
|
||
json.dump(crop_data_message, f, ensure_ascii=False, indent=2, default=str)
|
||
print(f"\n✅ 作物数据已保存到 crop_data_debug.json")
|
||
|
||
# 测试道具数据
|
||
print("\n=== 测试道具数据 ===")
|
||
item_config = mongo_api.get_item_config()
|
||
|
||
if item_config:
|
||
# 模拟服务器发送的item_config_message
|
||
item_config_message = {
|
||
"type": "item_config_response",
|
||
"success": True,
|
||
"item_config": item_config
|
||
}
|
||
|
||
print(f"道具数据类型: {type(item_config)}")
|
||
|
||
# 检查是否有config_type字段
|
||
if 'config_type' in item_config:
|
||
print(f"⚠️ 道具数据包含config_type: {item_config['config_type']}")
|
||
else:
|
||
print("✅ 道具数据不包含config_type字段")
|
||
|
||
# 保存道具数据到文件
|
||
with open('item_config_debug.json', 'w', encoding='utf-8') as f:
|
||
json.dump(item_config_message, f, ensure_ascii=False, indent=2, default=str)
|
||
print(f"✅ 道具数据已保存到 item_config_debug.json")
|
||
|
||
# 检查JSON序列化后的数据
|
||
print("\n=== 测试JSON序列化 ===")
|
||
if crop_data:
|
||
try:
|
||
# 模拟服务器发送数据时的JSON序列化过程
|
||
json_str = json.dumps(crop_data_message, ensure_ascii=False, default=str)
|
||
|
||
# 模拟客户端接收数据时的JSON反序列化过程
|
||
received_data = json.loads(json_str)
|
||
|
||
print("✅ JSON序列化/反序列化成功")
|
||
|
||
# 检查反序列化后的数据结构
|
||
received_crop_data = received_data.get('crop_data', {})
|
||
|
||
# 检查第一个作物的数据
|
||
for crop_name, crop_info in received_crop_data.items():
|
||
if crop_name not in ['_id', 'config_type']:
|
||
print(f"\n反序列化后的作物 {crop_name}:")
|
||
print(f" 数据类型: {type(crop_info)}")
|
||
|
||
if isinstance(crop_info, dict):
|
||
if '能否购买' in crop_info:
|
||
value = crop_info['能否购买']
|
||
print(f" 能否购买: {value} (类型: {type(value)})")
|
||
elif isinstance(crop_info, str):
|
||
print(f" ⚠️ 反序列化后变成字符串: '{crop_info[:50]}...'")
|
||
|
||
break
|
||
|
||
except Exception as e:
|
||
print(f"❌ JSON序列化/反序列化失败: {e}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ 测试过程中出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
finally:
|
||
if 'mongo_api' in locals():
|
||
mongo_api.disconnect()
|
||
print("\n✅ 数据库连接已关闭")
|
||
|
||
if __name__ == "__main__":
|
||
test_client_data_format() |