gpt4 book ai didi

单独测试 Dexterity 内容创建

转载 作者:行者123 更新时间:2023-11-28 20:32:41 24 4
gpt4 key购买 nike

对于一个项目,我有一个复杂的主对象,其中包含许多子组件。这些对象的设置由构造函数接口(interface)控制,我将其绑定(bind)到各种生命周期和工作流事件,如下所示:

@grok.subscribe(schema.ICustomFolder, lifecycleevent.IObjectAddedEvent)
def setup_custom_folder(folder, event):
interfaces.IConstructor(folder).setup()

@grok.subscribe(schema.ICustomFolder, lifecycleevent.IObjectModifiedEvent)
def setup_custom_folder(folder, event):
interfaces.IConstructor(folder).update()

我希望能够做的是测试 Constructor 方法而不依赖于事件处理程序。我尝试通过直接创建对象来避免生命周期事件来做到这一点:

def test_custom_item_constructor(self):
master = createContent('model.master_object',
needed_attribute = 2
)
folder = createContent('model.custom_folder',
__parent__ = master
)
self.assertEqual(0, len(folder))
constructor = interfaces.IConstructor(folder)
constructor.setup()
self.assertEqual(2, len(folder))

setup 方法根据主对象上提供的属性在 Custom_Folder 实例中创建多个项目。然而,这是挂起的,我认为这是由于两个对象实际上都不属于该站点,所以没有获得权限。我可以通过将主对象上的 createContent 更改为 createContentInContainer 并将其添加到测试站点的适当部分来实现这一点,但这会触发所有 生命周期事件,最终执行构造函数调用,这不允许我单独测试它们。

我已经尝试为此使用模拟对象,但是在处理本应在构造函数 .setup 期间发生的内容创建时变得很困惑。

解决这个问题的最佳方法是什么?

最佳答案

我不确定这是否是最好的方法,但我设法通过首先禁用相关事件处理程序,然后在站点内正确创建内容来获得我想要的结果:

def test_custom_item_constructor(self):
zope.component.getGlobalSiteManager().unregisterHandler(
adapters.master.constructor.setup_masterobject,
required=[schema.IMasterObject, lifecycleevent.IObjectAddedEvent]
)
zope.component.getGlobalSiteManager().unregisterHandler(
adapters.custom.constructor.setup_customfolder,
required=[schema.ICustomFolder, lifecycleevent.IObjectAddedEvent]
)
master = createContentInContainer(self.portal, 'model.master_object',
needed_attribute = 2
)
folder = createContentInContainer(master, 'model.custom_folder',
__parent__ = master
)
self.assertEqual(0, len(folder))
constructor = interfaces.IConstructor(folder)
constructor.setup()
self.assertEqual(2, len(folder))

这足以解除由添加新主对象触发的事件链。

关于单独测试 Dexterity 内容创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com