2016-03-04 119 views
0

我們有一個基於敏捷度的內容類型,它必須從父級繼承字段的默認值。我們使用以下命令:如何使用IContextAwareDefaultFactory測試內容類型

在模型:

<model xmlns="http://namespaces.plone.org/supermodel/schema" 
     xmlns:indexer="http://namespaces.plone.org/supermodel/indexer" 
     xmlns:form="http://namespaces.plone.org/supermodel/form"> 
    <schema> 
    ... 
    <field name="subjects" type="zope.schema.Tuple" indexer:searchable="true"> 
     ... 
     <defaultFactory>my.package.content.default_subjects</defaultFactory> 
     ... 
    </field> 
    </schema> 
</model> 

工廠聲明如下:

from zope.schema.interfaces import IContextAwareDefaultFactory 
... 
@provider(IContextAwareDefaultFactory) 
def default_subjects(context): 
    return getattr(context, 'subjects',()) 

這運行的實例時工作得很好:

(Pdb) context 
<MyType at /Plone/folder> 
(Pdb) type(context) 
<type 'Acquisition.ImplicitAcquisitionWrapper'> 

但當環境未被包裝時運行測試時失敗:

(Pdb) context 
<MyType at test> 
(Pdb) type(context) 
<class 'my.package.content.MyType'> 

我該如何解決這個問題?

+0

勉強相關:[類似的問題](https://github.com/collective/collective.newsticker/blob/master/src/collective/newsticker/controlpanel。 py#L22-L30)我前一段時間。 – hvelarde

+0

你正在運行什麼類型的測試? 你看看https://github.com/plone/plone.dexterity/blob/master/plone/dexterity/tests/test_content.py#L492-L523 從這我收集它取決於你的架構正確加載進入fti。 也許這是缺少。取決於你的測試設置。 – do3cc

+0

這些是測試:https://github.com/plonegovbr/brasil.gov.agenda/blob/07b978038f5b0da18a66d449ec8f2b1c7e03d560/src/brasil/gov/agenda/tests/test_agendadiaria.py#L80-L98 – hvelarde

回答

1

你正在做的一切正確。 當代碼試圖訪問對象那樣:

>>> object.subjects 

subjects從未被設置,__getattr__實施敏捷的開始工作。這個__getattr__缺少屬性的魔力是由Python實現的。它不知何故失去了收購包裝。 丟失收購包裝後,aq_parent和父母都不能繼續工作。 在我的測試中,我可以通過調用

>>> object.__getattr__('subjects') 

繞過這個但這並不理想。

鑑於代碼中沒有這個問題,因爲視圖根本不通過object.subjects訪問屬性,所以採集上下文永遠不會丟失。

我會在這裏完成我的分析,但是我在plone.dexterity的bugreport中注意到了我的發現。也許你想在那裏提供一個最小的測試: https://github.com/plone/plone.dexterity/issues/53

+0

謝謝,不幸的是,我會必須等待該項目的更多資金;我將添加對此的參考。 – hvelarde

相關問題