2

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_BTest_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明らかに、そのチェックがあれば、スイート内のすべての単体テストのブロックに貼り付けることができます。

4

1 に答える 1