zope[2]测试模型对象的(仍然很小)存储库。

dm.zope.mockup的Python项目详细描述


这是一个(仍然很小)存储库,其中包含要使用的模型对象 在用于zope 2应用程序和应用程序组件的测试套件中。

zodb

通常,zodb(zope对象数据库)透明地处理持久性。 但是,也有一些重要的例外:当可变属性 通过其方法修改持久对象的 了解这些修改。没有特别措施 修改不是持久化的,也不是不确定地持久化的。 这种持久性错误很难检测,因此,应该 被明确地测试。这个模块定义了一个zodb模型 有助于此类测试的连接。

模型连接具有以下特殊方法:

get_stateobj

返回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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
并行处理java。util。同时发生的叉子在游泳池里。常见的并行性准则,用于选择正确的并行度大小   java如何将空白字符追加到指定长度?   安卓应用程序中出现错误,SSLHandshakeException,找不到证书路径的信任锚点   java如何使用JUnit Mockito验证检查方法是否未被调用   java如何使用不同的@RequestMapping解析多个控制器中的静态页面   Selenium中的javascript需要验证搜索结果   访问数据库SQLiteopenHelper方法时java应用程序崩溃(nullpointerexception)   在二叉树中验证最小堆时出现java空指针异常   Java 7的SSL连接失败   java用RestEasyWebTarget替换ProxyFactory不起作用   在Java应用程序中单击“否”按钮后,数组程序冻结(无响应)   数组中的前缀Java初学者前进和   Java HTML解析器,包括脚本标记和LineNumberReader   在java中为长类型数字加前导零   正则表达式无法映射正则表达式java。lang.IllegalArgumentException:模式段中捕获组的数量