我正在为 Plone 和内部测试覆盖开发一个 PAS 插件我也在测试生成的 HTML(我没有使用 zope.testbrowser 或类似的东西,我需要测试的东西非常简单)。问题是,当测试运行时调用堆栈与浏览器使用完全不同(在一个真实的 Plone 站点上,我复制了测试环境)。
这里有一个失败的测试:
portal = self.layer['portal']
request = self.layer['request']
request.set('ACTUAL_URL', 'http://nohost/plone/folder/subfolder')
request.set('URL', 'http://nohost/plone/folder/subfolder')
login(portal, 'user2')
output = self.folder.subfolder()
上面的子文件夹是一个ATCT文件夹,我称之为默认视图(文件夹列表)。
现在,PAS 插件正在实现该checkLocalRolesAllowed
方法。
def checkLocalRolesAllowed(self, user, object, object_roles):
...
发生了什么:
- 使用浏览器,第一次调用
checkLocalRolesAllowed
是通过object
= <ATFolder at subfolder>,user
='users2' - 运行测试第一次调用
checkLocalRolesAllowed
是在门户根目录上完成的:object
= <PloneSite at plone>,user
='user2'
在这两种情况下,该方法都被调用了很多额外的时间(这是正常的),但调用顺序完全不同。
在测试中,子文件夹上下文仅在堆栈顺序中排在第 4 位(前两次是 Plone 站点,第三次是 ZCatalog)。
从“好”行为是浏览器再现的事实出发,如何在测试中模拟相同的行为?为什么portal.folder.subfolder()
在第一次通话时使用 Plone 站点?
注意:我测试了其他组合,例如使用restrictedTraverse
, portal.folder.subfolder.folder_listing()
, ... 没有任何效果。