1

プロジェクトの場合、いくつかのサブコンポーネントを含む複雑なマスターオブジェクトがあります。これらのオブジェクトの設定は、次のようなさまざまなライフサイクルおよびワークフローイベントにバインドするコンストラクターインターフェイスによって制御されます。

@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()

私ができるようにしたいのは、イベントハンドラーに依存せずにコンストラクターメソッドをテストすることです。ライフサイクルイベントを回避するために、オブジェクトを直接作成してこれを実行しようとしました。

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

これにアプローチするための最良の方法は何ですか?

4

1 に答える 1

2

これが最善の方法かどうかはわかりませんが、最初に関連するイベントハンドラーを無効にしてから、サイト内にコンテンツを適切に作成することで、希望する結果を得ることができました。

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))

これは、新しいマスターオブジェクトの追加によってトリガーされた一連のイベントを解除するのに十分でした。

于 2012-08-09T06:04:18.613 に答える