zope[2]测试模型对象的(仍然很小)存储库。
dm.zope.mockup的Python项目详细描述
这是一个(仍然很小)存储库,其中包含要使用的模型对象 在用于zope 2应用程序和应用程序组件的测试套件中。
zodb
通常,zodb(zope对象数据库)透明地处理持久性。 但是,也有一些重要的例外:当可变属性 通过其方法修改持久对象的 了解这些修改。没有特别措施 修改不是持久化的,也不是不确定地持久化的。 这种持久性错误很难检测,因此,应该 被明确地测试。这个模块定义了一个zodb模型 有助于此类测试的连接。
模型连接具有以下特殊方法:
- get_state(obj)
返回obj的当前状态,以便稍后在verify_state中使用。
作为副作用,obj注册(添加到)连接 (如有必要)。
- verify_state(状态)
state必须是通过先前对get_state的调用获得的。 调用验证对相应obj的所有修改 其子组件已正确注册到zodb。 它引发一个AssertionError,其中包含有关 失败的持久子对象。
作为副作用,在 验证已注册(添加到)连接。
由于http://bugs.python.org/issue12596,这个 当前工作不可靠:Python2.7引入了(minor) 抑制BINPUTpickle指令的优化 在一些(罕见的)情况下。因为verify_state比较了 pickle和当前的pickle为了检测修改,这个 Bug让我们看到它在没有的地方发生了变化。当前版本 试图通过不逐字比较pickles来解决这个问题 但是检查等价模*PUT操作。这个 实现的等价性并不完美(例如 认识到dumps(("spam","spam"), 2)和 dumps(("spaml"[:-1],"spaml"[:-1]), 2)是等价的)但是 它可能足够实际使用。
- emulate_commit()
- 执行一个保存点,其效果与commit相似,但是 将在下一个事务中止前撤消。
模块的get_mockup_connection``() returns a mockup connection. Behind this is a ``DemoStorage(即在内存中存储其状态的存储器)。 实际上,get_mockup_connection返回一个单例连接,[重新]打开, 在中止的事务中与它自己的TransactionManager关联。
以下是典型的测试示例:
>>> # elementary setup ... from persistent import Persistent >>> from dm.zope.mockup.zodb import get_mockup_connection >>> >>> class P(Persistent): ... def __init__(self, id): self.id = id ... # to get predictable output ... def __repr__(self): return self.id ... >>> # work around for "python setup.py test" peculiarity ... import __builtin__; __builtin__.P = P >>> >>> c = get_mockup_connection() >>> obj = P('obj')
>>> # normal attribute assignment ... state = c.get_state(obj) >>> obj.l = [] >>> c.verify_state(state)
>>> # get_mockup_connection aborts the transaction ... # in our case, it does not change the state of "obj" as ... # this was newly created ... obj._p_changed True >>> c = get_mockup_connection() >>> obj._p_changed False
>>> # unregistered modification of mutable attribute ... state = c.get_state(obj) >>> obj.l.append(1) >>> c.verify_state(state) Traceback (most recent call last): ... AssertionError: ('unregistered modifications', [obj])
>>> # registered modification of mutable attribute ... state = c.get_state(obj) >>> obj._p_changed = True >>> obj.l.append(1) >>> c.verify_state(state)
>>> # the same works for persistent subobjects as well ... c = get_mockup_connection() >>> >>> obj0 = P('obj0') >>> obj = obj0.obj = P('obj') >>> >>> state = c.get_state(obj0) >>> obj.l = [] >>> c.verify_state(state) >>> c.emulate_commit() >>> >>> state = c.get_state(obj0) >>> obj.l.append(1) >>> c.verify_state(state) Traceback (most recent call last): ... AssertionError: ('unregistered modifications', [obj]) >>> >>> state = c.get_state(obj0) >>> obj._p_changed = True >>> obj.l.append(1) >>> c.verify_state(state)