2016-07-25 2 views
0

Im書き込みユニットは、PythonでFlaskで書かれたAPIをテストします。具体的には、ルートのエラー処理が適切に機能するようにテストしたいので、欠落しているパラメータがあるURLを意図的に作成したいと考えています。私はハードコーディングを避けるために、url_for()を使用していますが、パラメータが不足していることを許可していないので、不正なURLを構築する方法はありますか?ユニットテストで意図的にurl_for()で不正なURLを構築するには?

+0

= parameters'または '/ these/parameters/42/name'? –

+0

URLにパラメータを含むGETです(例:/status/ Eno

答えて

2

url_forになると、2種類のURLが生成されます。

@app.route('/favorite/color/<color>') 
def favorite_color(color): 
    return color[::-1] 

のような名前のルートがある場合、その後、URLパラメータが必要です:

url_for('favorite_color') 
BuildError: Could not build url for endpoint 'favorite_color'. Did you forget to specify values ['color']? 

しかし、ルート自体に存在していない任意のパラメータは、単にクエリ文字列パラメータに変換されます:あなたが欠落しているパラメータを使用してURLを尋ねるとき

print(url_for('favorite_color', color='blue', no='yellooooowwww!')) 
/favorite/color/blue?no=yellooooowwww%21 

だから、何を求めていることはのURL THAですtには経路がありません。フラスコは存在するエンドポイントのパラメータを作成しようとしているため、そのURLを作成することはできません。

あなたができることは、範囲外のパラメータ値を使用することです。

url_for('favorite_color', color='toaster') 

トースターは実際の色ではないため、404を返す必要があります。パラメータがない場合は、別のコンテキストでも意味をなさない可能性があるので、そのことを考慮する必要があります。 本当に欠けているパラメータが必要な場合は、実際に実行したいのはクエリーストリングの引数を使用することです。しかし、サーバーに存在しないURLがサーバーに実際に存在しないことを確認して死んでしまう場合は、次のようにしてください:

url_for('favorite_color', color='fnord').replace('/fnord', '') 
+0

範囲外の値を使用してしまったと思います。 'url_for( 'api.status'、id = '')'不正なリクエスト処理をテストします。説明ありがとう。 – Eno

関連する問題