0

次のようなピラミッド ビューをテストしたいと思います。

def index(request):
    data = request.some_custom_property.do_something()
    return {'some':data}

some_custom_propertyこのようなイベント ハンドラーを介してリクエストに追加されます。

@subscriber(NewRequest)
    def prepare_event(event):
        event.request.set_property(
            create_some_custom_property,
            'some_custom_property',reify=True
        )

私の問題: テスト リクエストを手動で作成すると、イベントがトリガーされないため、イベントが正しく設定されません。実際のイベント ハンドラーはより複雑で構成設定に依存するため、テスト コードでそのコードを再現したくありません。ピラミッド型のインフラを最大限活用したい。以前の質問から、ini ファイルから実際のピラミッド アプリをセットアップする方法を学びました。

from webtest import TestApp
from pyramid.paster import get_app

app = get_app('testing.ini#main')
test_app = TestApp(app)

正常にtest_app動作しますが、html 出力しか取得できません (これは の考え方ですTestApp)。私がやりたいことは、orindexのコンテキストで実行することですが、レンダラーに送信される前に の結果を取得することです。apptest_appindex

それを行う方法のヒントはありますか?

4

1 に答える 1

2

まず第一に、このようなドキュメントテストを書くのは本当に悪い考えだと思います。多くの初期化作業が必要なため、これはドキュメント (doctests を思い出してください) に含まれる予定であり、何も「ドキュメント化」しません。そして、私には、これらのテストはユニット/統合テストの仕事のようです。しかし、本当にやりたい場合は、次の方法があります。

import myapp
from pyramid.paster import get_appsettings
from webtest import TestApp
app, conf = myapp.init(get_appsettings('settings.ini#appsection'))
rend = conf.testing_add_renderer('template.pt')
test_app = TestApp(app)
resp = test_app.get('/my/view/url')
rend.assert_(key='val')

wheremyapp.initはアプリケーションの初期化関数と同じ働きをする関数で、 (ここではfunctionのpserveように) によって呼び出されます。Exceptは引数を 1 つ取ります。これは (の代わりに) 設定辞書です。そして、app (つまり) と(つまりインスタンス) を返します。はインスタンスです。mainmyapp.initmain(global_config, **settings)conf.make_wsgi_app()confpyramid.config.Configuratorrendpyramid.testing.DummyTemplateRenderer

PS私の英語で申し訳ありませんが、私の答えを理解していただければ幸いです。

アップデート。rendレンダラーに渡される値であるプロパティがあることを忘れて_receivedいましたが、パブリック インターフェイスではないため、使用することはお勧めしません。

于 2013-06-05T17:17:41.977 に答える