2017-11-27 6 views
0

私は、経路をビューにマッピングするためにURLディスパッチを使用するPyramid Webアプリケーションを作成しています。ピラミッドアプリのルートマッチングをどのようにユニットテストすればよいですか?

私はパスの様々なピラミッドの「ルートマッチャ」を提供ユニットテストのセットを記述し、そのを主張したいと思います:

  1. 正しいビューがrequest.matchdictが含まれてい
  2. と呼ばれています予想される内容

どのように(実際のHTTPリクエストを送信することで、機能レベルではなく)私はこれは適切なユニットテストレベルで行うことができますか?ピラミッドのどの「ユニット」が実際にルートマッチングを行うのですか?また、アプリのコンフィグレーションされたルーティングをテストするためにどうすればアクセスできますか?

:私は機能テストを使用してこれを行うことができます知っているが、私ははるかに狭く、それをテストする方法を知りたいので、私はこの質問をしています - ちょうどルート一致部分を。私はGoogleで検索してDispatching URLs To Views With RoutingUnit, Integration, and Functional Testing含む関連ピラミッドのマニュアルを、読んだ

...それは、複数のコンポーネントに触れるため、統合テストではなく、ユニットテストと見なされるかもしれないものを私が探していると仮定します。私が見たことは、機能テストを行わずにアプリケーションの構成済みルートをテストする方法を示しているものではありません。

+1

Pyramidサイトで[ユニット、統合、機能テスト](https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html)を見たことがありますか? – wwii

+0

はい、このページで説明している機能テストを使用して、私が関心のあるアサーションを実行できます。私が疑問に思っているのは、具体的にはルートマッピング機能の適切で狭い_unit_テストを達成する方法です。 – Stew

+0

私はPyramidの仕組みについてもっと知りたいと思っていますし、機能テストは一般的に遅く、賢明で単調なテストよりメンテナンスが難しいので興味があります。 – Stew

答えて

1

ピラミッドでこれを行うための公開APIはありません。しかし、プライベートでかなり安定したAPIがあります。あなたは警告されています。

ルートマッチングはパターンだけでなく述語にも起こりませんので、URLだけでなくマッチングを行うには完全なリクエストオブジェクトが必要です。

registry = config.registry or request.registry 
mapper = registry.getUtility(pyramid.interfaces.IRoutesMapper) 
result = mapper(request) 
route, matchdict = result['route'], result['match'] 
if route is not None: 
    route # pyramid.interfaces.IRoute object 
    matchdict # request.matchdict 

IRouteオブジェクト自体は、イントロスペクタを介したパブリックAPIで利用できます。これをルックアップしてルート別に照合することはできますが、これはピラミッド固有のルート順序を無視します。

introspector = config.registry or request.registry.introspector 
intr = introspector.get('routes', route_name) 
route = intr['route'] 
match = route.match(path) 
if match is not None: 
    route # pyramid.interfaces.IRoute object 
    match # request.matchdict 

ルートはまた、述語が通過するかどうかを決定するためににrequestを渡すことができ、その上に述語を持っています。

関連する問題