私が実行している単体テスト ケースでは、KeyError
以下の json テキストの 4 番目の json オブジェクトで例外が発生します。これは、デコードを担当するコードの一部が、存在しないはずのオブジェクトを探しているためです。
サブオブジェクトを調べたところ、問題の原因は「cpuid」オブジェクトであることがわかりました。削除してテストを実行すると、正常に動作します。
def _make_report_entry(record):
response = self.app.post(
'/machinestats',
params = dict(record = self.json_encode([{
"type": "crash",
"instance_id": "xxx",
"version": "0.2.0",
"build_id": "unknown",
"crash_text": "Gah!"
},
{
"type": "machine_info",
"machine_info": "I'm awesome.",
"version": "0.2.0",
"build_id": "unknown",
"instance_id": "yyy"
},
{
"machine_info": "Soup",
"crash_text": "boom!",
"version": "0.2.0",
"build_id": "unknown",
"instance_id": "zzz",
"type": "crash"
},
{
"build_id": "unknown",
"cpu_brand": "intel",
"cpu_count": 4,
"cpuid": {
"00000000": {
"eax": 123,
"ebx": 456,
"ecx": 789,
"edx": 321
},
"00000001": {
"eax": 123,
"ebx": 456,
"ecx": 789,
"edx": 321
}
},
"driver_installed": True,
"instance_id": "yyy",
"version": "0.2.0",
"machine_info": "I'm awesome.",
"os_version": "linux",
"physical_memory_mib": 1024,
"product_loaded": True,
"type": "machine_info",
"virtualization_advertised": True
}
])))
テスト中のコードでは、django.utils の simplejson.JSONDecoder を使用して JSON をデコードします。デコード関数に渡される上記の JSON のデコードされた出力をログに記録すると、次のようになります。
root: INFO: {u'instance_id': u'xxx', u'type': u'crash', u'crash_text': u'Gah!', u'version': u'0.2.0', u'build_id': u'unknown'}
root: INFO: {u'build_id': u'unknown', u'instance_id': u'yyy', u'version': u'0.2.0', u'machine_info': u"I'm awesome.", u'type': u'machine_info'}
root: INFO: {u'build_id': u'unknown', u'machine_info': u'Soup', u'version': u'0.2.0', u'instance_id': u'zzz', u'crash_text': u'boom!', u'type': u'crash'}
root: INFO: {u'eax': 123, u'edx': 321, u'ebx': 456, u'ecx': 789}
最後の JSON オブジェクトでは、JSON cpuid オブジェクト内のオブジェクトのみがデコード関数に渡されています。私のデコード関数は他のオブジェクト ('type'、'instance_id' など) を予期しているため、KeyError 例外が発生します。
[以前の不必要に長い投稿で申し訳ありません。これでもう少し絞り込むことができれば幸いです]