首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用IContextAwareDefaultFactory测试内容类型

如何使用IContextAwareDefaultFactory测试内容类型
EN

Stack Overflow用户
提问于 2016-03-04 22:57:52
回答 1查看 163关注 0票数 0

我们有一个基于灵活性的内容类型,它必须从其父字段继承字段的默认值。我们使用以下代码:

在模型中:

代码语言:javascript
复制
<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:indexer="http://namespaces.plone.org/supermodel/indexer"
       xmlns:form="http://namespaces.plone.org/supermodel/form">
  <schema>
    ...
    <field name="subjects" type="zope.schema.Tuple" indexer:searchable="true">
      ...
      <defaultFactory>my.package.content.default_subjects</defaultFactory>
      ...
    </field>
  </schema>
</model>

工厂声明如下:

代码语言:javascript
复制
from zope.schema.interfaces import IContextAwareDefaultFactory
...
@provider(IContextAwareDefaultFactory)
def default_subjects(context):
    return getattr(context, 'subjects', ())

这在运行实例时运行得很好:

代码语言:javascript
复制
(Pdb) context
<MyType at /Plone/folder>
(Pdb) type(context)
<type 'Acquisition.ImplicitAcquisitionWrapper'>

但在运行测试时会失败,因为上下文没有包装:

代码语言:javascript
复制
(Pdb) context
<MyType at test>
(Pdb) type(context)
<class 'my.package.content.MyType'>

我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2016-04-05 19:00:38

你做的每件事都是正确的。在代码中,您尝试像这样访问主题:

代码语言:javascript
复制
>>> object.subjects

如果从未设置过subjects,则Dexterity的__getattr__实现将开始其工作。这种缺失属性的__getattr__魔术是由Python实现的。它以某种方式松开了获取包装。松开获取包装器后,aq_parent和都无法继续工作。在我的测试中,我能够通过调用

代码语言:javascript
复制
>>> object.__getattr__('subjects')

但这并不令人满意。

在视图代码中,您没有这个问题,因为视图根本不通过object.subjects访问属性,因此获取上下文永远不会丢失。

我将在这里完成我的分析,但我在plone.dexterity的bugreport中记录了我的发现。也许您想在那里提供一个最小的测试:https://github.com/plone/plone.dexterity/issues/53

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35799092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档