如何在测试中启用Dexterity行为?

时间:2014-08-23 14:05:04

标签: testing plone behavior dexterity

我正在为基于敏捷的内容类型编写一个行为;它工作正常,但我不知道在测试中启用它的正确方法是什么。

我使用以下内容:

def _enable_background_image_behavior(self):
    fti = queryUtility(IDexterityFTI, name='collective.cover.content')
    behaviors = list(fti.behaviors)
    behaviors.append(self.name)
    fti.behaviors = tuple(behaviors)

def _disable_background_image_behavior(self):
    fti = queryUtility(IDexterityFTI, name='collective.cover.content')
    behaviors = list(fti.behaviors)
    behaviors.remove(self.name)
    fti.behaviors = tuple(behaviors)

但在某些Plone版本中似乎没有禁用或启用该行为(它在Plone 4.2和Plone 4.3中表现不同,可能是因为Dexterity从1.x移动到2.x)。

测试的完整代码位于:https://github.com/collective/collective.cover/blob/background-image-behavior/src/collective/cover/tests/test_behaviors.py

Plone 4.2中的测试结果:https://travis-ci.org/collective/collective.cover/jobs/33327495

在集成测试中启用和禁用行为的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

谢谢,Asko,指出我正确的方向:我最终以下列方式使架构缓存失效:

from plone.dexterity.schema import SchemaInvalidatedEvent
from zope.event import notify

# invalidate schema cache
notify(SchemaInvalidatedEvent('collective.cover.content'))

答案 1 :(得分:1)

我相信您正确地执行了此操作,但问题与dx 1.x和2.x之间的缓存修复有关。我已设法在测试设置中清除dx缓存:

def testSetUp(self):
    import plone.dexterity.schema
    for name in dir(plone.dexterity.schema.generated):
        if name.startswith("plone"):
            delattr(plone.dexterity.schema.generated, name)
    plone.dexterity.schema.SCHEMA_CACHE.clear()