Files
Sprout-Farm/Server/test/test_client_data.py

147 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()