2013-09-27 51 views
2

我正在写一些涉及ZODB的测试,并且由于我在单元测试中遇到的错误,我长时间卡住了。让我们把它叫做Test_B你如何检查你是否在与Python中的ZODB交易?

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()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块中。

回答

1

您通常会关闭测试之间的连接到ZODB,以确保测试是孤立的。

关闭与活动事务一个ZODB连接将引发一个异常:

>>> from ZODB.FileStorage import FileStorage 
>>> from ZODB.DB import DB 
>>> storage = FileStorage('Data.fs') 
>>> db = DB(storage) 
>>> connection = db.open() 
>>> root = connection.root() 
>>> root['foo'] = 'bar' 
>>> connection.close() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/ZODB/Connection.py", line 286, in close 
    raise ConnectionStateError("Cannot close a connection joined to " 
ZODB.POSException.ConnectionStateError: Cannot close a connection joined to a transaction 
+0

啊我想我可以;这涉及将连接放在套件的范围内,这是可行的。 AfterEach然后将尝试关闭连接。如果它不抛出异常,那么我知道有什么不对。谢谢! – fatuhoku

相关问题