我正在编写一些软件包的测试,我需要验证是否正确注册了一些静态资源。
在Plone 5之前我只需访问资源注册表就可以做到这一点:
self.portal.portal_javascripts.getResourceIds()
self.portal.portal_css.getResourceIds()
如何在Plone 5中完成该任务?
答案 0 :(得分:1)
似乎答案就在于tests for resources in Products.CMFPlone。
具体来说,在该文件的测试用例中,有许多测试使用配置注册表来访问已注册的包和资源,如下所示:
from Products.CMFPlone.interfaces import IBundleRegistry
from Products.CMFPlone.interfaces import IResourceRegistry
from plone.registry.interfaces import IRegistry
from zope.component import getUtility
resources = getUtility(IRegistry).collectionOfInterface(
IResourceRegistry, prefix="plone.resources"
)
bundles = getUtility(IRegistry).collectionOfInterface(
IBundleRegistry, prefix="plone.bundles"
)
这些调用的返回值是类似dict的对象,它们包含指向使用registry.xml
通用安装程序导入步骤注册的包或资源的配置注册表项的指针。
因此,例如,如果您使用以下xml在产品中注册了一个包:
<records prefix="plone.bundles/my-product"
interface='Products.CMFPlone.interfaces.IBundleRegistry'>
<value key="resources">
<element>my-resource</element>
</value>
<value key="enabled">True</value>
<value key="jscompilation">++plone++static/my-compiled.js</value>
<value key="csscompilation">++plone++static/my-compiled.css</value>
<value key="last_compilation">2014-08-14 00:00:00</value>
</records>
然后在上面的资源注册表返回的bundles
中,您可以使用斜杠('my-product'
)后面的“前缀”部分来查找注册表记录您的捆绑代理如下:
my_bundle = bundles['my-product']
该记录将提供对捆绑包的已定义接口的属性访问(有关详细信息,请参阅Products.CMFPlone.interfaces.resources.IBundleRegistry)。所以你应该能够检查它是否为编译的js或css设置了正确的值:
assert my_bundle.jscompilation == '++plone++static/my-compiled.js'
assert my_bundle.csscompilation == '++plone++static/my-compiled.css'
注册资源的记录将以相同的方式工作,类似于字典的对象,其中的键对应于斜杠后registry.xml
中资源注册的“前缀”部分。在这种情况下返回的记录将支持Products.CMFPlone.interfaces.resources.IResourceRegistry。但您仍然可以使用属性访问来验证您期望的值是否已正确注册。
如果您有使用已弃用的portal_javascript
或portal_css
工具注册的资源(使用jsregistry.xml
或cssregistry.xml
通用设置导入步骤),那么找到它们的关键Plone现在会自动将这些资源包含在名为plone-legacy
的特殊包中。由于bundle具有resources
属性,该属性提供了该bundle中包含的资源列表,因此您应该能够执行以下操作:
bundles = getUtility(IRegistry).collectionOfInterface(
IBundleRegistry, prefix="plone.bundles"
)
legacy_bundle = bundles['plone-legacy']
assert "my-oldskool.js" in legacy_bundle.resources
这方面的例子也可以在tests for resources in Products.CMFPlone中找到。特别是在TestResourceNodeImporter
测试用例中。
答案 1 :(得分:0)
由于没有简单的方法来完成此任务,并且建议的解决方案添加了超过10行代码,我会说在Plone 5中必须跳过此测试:
IS_PLONE_5 = api.env.plone_version().startswith('5')
@unittest.skipIf(IS_PLONE_5, 'No easy way to test this under Plone 5')
def test_cssregistry(self):
resource_ids = self.portal.portal_css.getResourceIds()
self.assertIn(CSS, resource_ids)