2016-12-09 1 views
3

Flaskアプリケーション用のテストをいくつか書いています。テストケース内からurl_forを呼び出して生成されたものとtest_clientレスポンスのURLが一致しない問題が発生しています。例えば、私は私のテンプレートでは、次のしている:テストでurl_forを使用する

<li><a href="#" onClick="requestReport('{{ url_for('report') }}', '{{ session['email'] }}');">Report</a></li> 

test_clientからの応答としてこれをレンダリング:

<li><a href="#" onClick="requestReport('/api/report', '[email protected]');">Report</a></li> 

私は確かにこのURLがページに表示させるためにチェックするテストケースを持っています一定の条件の下で:

self.client = self.app.test_client(use_cookies=True) 
with self.app.app_context(): 
    page = self.client.get(url_for("index"), follow_redirects=True).data.decode() 
    assert url_for("report") in page 

問題は、テンプレート内なurl_for呼び出しがより異なる出力を生成しているため、このテストは、URLがページに表示された場合でも、失敗するということですテストケースのurl_forコール。私はテストケースコードからなurl_for(「報告書」)を印刷する場合は、私が手:私は、SERVER_NAMEが設定されていない場合ので:

http://localhost:5000/api/report 

は、私が「5000 localhost」をに設定app.configをでSERVER_NAMEキーを持っていますテストケースのコードは、このエラーがスローされます。

明らか
RuntimeError: Application was not able to create a URL adapter for request independent URL generation. You might be able to fix this by setting the SERVER_NAME config variable. 

、私は私のテストケースコードでURLをハードコーディングすることによってこの問題を回避できますが、私は私のURLへの将来的な変更がないようになurl_forを使用することを好むだろうテストコードを破る。

私は、応答で生成されたものとまだ一致しない不正な形式のURLを生成するだけでなく、SERVER_NAMEとしていくつかの異なる文字列を試しました。

URLをハードコードする以外にこれを修正する方法はありますか?

答えて

0

テストコードのようにアプリケーションコンテキストでurl_forを使用すると、Flaskは完全なホスト名(SERVER_NAME設定変数で設定)を含む外部リンクを作成すると自動的に仮定します。テンプレートのurl_forはホスト名なしの内部リンクを作成します。だから彼らは一致しません。同等性をチェックするには、_externalプロパティをFalseに明示的に設定する必要があります。

self.client = self.app.test_client(use_cookies=True) 
with self.app.app_context(): 
    page = self.client.get(url_for("index"), follow_redirects=True).data.decode() 
    assert url_for("report", _external=False) in page 
3

APIのテストのためには、使用することができますtest_request_context

class TestFlaskApi(unittest.TestCase):           
    def setUp(self):                
     self.app = create_app()             
     self.app_context = self.app.test_request_context()      
     self.app_context.push()             
     self.client = self.app.test_client() 

    def test_hello(self):              
     response = self.client.get(url_for('api.hello'),      
            content_type='text')       

     self.assertEqual(response.get_data(as_text=True), 'hello') 
関連する問題