ZODB に関連するいくつかのテストを書いていたのですが、単体テストでエラーが発生したため、長い間行き詰まりました。それを呼びましょうTest_B
:
Failure/Error: 'NoneType' object has no attribute 'sortKey'
...
File <<< my code somewhere >>>
transaction.commit()
File "/usr/local/lib/python2.7/site-packages/transaction/_manager.py", line 111, in commit
return self.get().commit()
File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 280, in commit
reraise(t, v, tb)
File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 271, in commit
self._commitResources()
File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 386, in _commitResources
L.sort(key=rm_key)
File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 555, in rm_key
return func()
File "/usr/local/lib/python2.7/site-packages/ZODB/Connection.py", line 813, in sortKey
return "%s:%s" % (self._storage.sortKey(), id(self))
ありがたいことに、 (当然のことながら)呼び出されるtransaction.commit()
前に実行されるテストで aを呼び出すのを忘れていたことが最終的にわかりました。ログに記録される一連のイベントは次のようになります。Test_B
Test_A
<<< Test_A begins >>>
23:01:41 DEBUG txn.140735119446400: new transaction
...
<<< no further mentions of txn.140735119446400 being committed or aborted >>>
<<< Test_A ends >>>
<<< Test_B begins >>>
23:01:41 DEBUG txn.140735119446400: new transaction
23:01:41 DEBUG my_spec: *** MANUALLY altered DB in Test_B body
...
<<< Test_B bails out due to error >>>
Test A
成功することに注意してください: これは間違っています! Test A
失敗して、コミットするのを忘れていたトランザクションに未処理の変更があることを伝えたいです。
ZODBでこれを行うにはどうすればよいですか? 変更を伴うトランザクションを行っているかどうかを確認するために使用できるドキュメントが見つかりません。
AfterEach
明らかに、そのチェックがあれば、スイート内のすべての単体テストのブロックに貼り付けることができます。