2016-04-06 10 views
4

いくつかのパッケージのテストを書いています。いくつかの静的リソースが正しく登録されているかどうかを確認する必要があります。Plone 5レジストリのリソースリストにプログラムでアクセスする方法

はPlone 5の前に、私はちょうどこのようなリソースのレジストリにアクセスすることによってそれを行うことができます。

self.portal.portal_javascripts.getResourceIds() 
self.portal.portal_css.getResourceIds() 

がどのように私はPloneの5でそのタスクを達成することができますか?

+0

:[リンク](https://pypi.python.org/pypi/plone。レジストリ#アクセスと操作レコード値)が、私はあなたがテストでこれを行う方法を知っていません。 – 1letter

答えて

0

、私はこのテストはちょうど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) 
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" 
) 

これらの呼び出しの戻り値は、辞書のようですが、オブジェクトには、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'] 

レコードは、バンドルの定義されたインタフェースへの属性アクセスを提供すること(を参照してください詳細はを参照してください)。

assert my_bundle.jscompilation == '++plone++static/my-compiled.js' 
assert my_bundle.csscompilation == '++plone++static/my-compiled.css' 

レコード登録されたリソースのための一部に対応するキーと同じように、辞書のようなオブジェクトを動作します:だからあなたはそれがコンパイルされたJSやCSSに設定された正しい値を持っていることを確認することができるはずですあなたのリソース登録の "接頭辞"はスラッシュの後にregistry.xmlにあります。その場合に返されたレコードは、代わりにProducts.CMFPlone.interfaces.resources.IResourceRegistryをサポートします。しかし、属性アクセスを使用して、期待どおりの値が正しく登録されていることを確認することはできます。

あなたは(jsregistry.xmlまたはcssregistry.xml汎用的な設定のインポート手順を使用して)非推奨portal_javascriptまたはportal_cssツールを使用して登録されたリソースを持っている場合は、それらを見つけるための鍵は、Ploneのは今自動的にplone-legacyと呼ばれる特殊なバンドルにそのようなリソースが含まれることです。バンドルは、そのバンドルに含まれたリソースのリストを提供しresources属性を持っているので、あなたはこのような何かを行うことができるはず:これの

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のテストケース。このタスクと提案された解決策は、コードの10の以上の行を追加しますを達成する簡単な方法がないため

+0

ありがとう、私のアドオンは、廃止予定のレジストリを使用してリソースを登録します。どうすればそれらを見つけることができますか? – hvelarde

+0

@hvelarde、私は私があなたが求めるものを達成するために働くと信じているコードを含めるために私の答えを編集しました。 – cewing

+0

はまだ期待通りには動作しませんが、もっと近く: 'legacy_bundle.resources'は次のようなリストを返します:' ''' 'リソースプランヌapp-discussion-javascripts-comments' '、' jquery-highlightsearchterms '' 'resource-plone-appリソース集合型lazysizes-lazysize-min-js、リソース集合型アプリケーションイベントイベント型、リソース集合型アプリケーションイベントイベント型、 '] ' – hvelarde

関連する問題