2017-10-09 139 views
0

我正在嘗試使用pytest爲Flask應用程序編寫單元測試。我有一個應用程序的工廠:爲Flask測試客戶端生成URL

def create_app(): 
    from flask import Flask 
    app = Flask(__name__) 
    app.config.from_object('config') 
    import os 
    app.secret_key = os.urandom(24) 
    from models import db 
    db.init_app(app) 
    return app 

和測試類:

class TestViews(object): 

    @classmethod 
    def setup_class(cls): 
     cls.app = create_app() 
     cls.app.testing = True 
     cls.client = cls.app.test_client() 

    @classmethod 
    def teardown_class(cls): 
     cls.app_context.pop() 

    def test_create_user(self): 
     """ 
     Tests the creation of a new user. 
     """ 
     view = TestViews.client.get(url_for('create_users')).status_code == 200 

但是當我運行我的測試中,我得到以下錯誤:

RuntimeError: Attempted to generate a URL without the application context being pushed. This has to be executed when application context is available. 

谷歌搜索這告訴我(我認爲)使用測試客戶端應創建一個自動應用程序上下文。我錯過了什麼?

回答

1

使用測試客戶端發出請求確實會推送應用程序上下文(間接)。但是,您將url_for在測試請求調用中可視化的內容與它實際上在內部調用的想法相混淆。首先對url_for調用進行評估,結果傳遞給client.get

url_for通常是用於內該應用生成的URL ,單元測試是外部。通常,您只需在請求中準確寫入您要測試的URL,而不是生成它。

self.client.get('/users/create') 

如果您真的想在這裏使用url_for,您必須在應用程序上下文中執行此操作。請注意,如果您處於應用上下文中,但不是請求上下文,則必須設置SERVER_NAME配置並通過_external=False。但是,再次,你應該寫出你想要測試的URL。

app.config['SERVER_NAME'] = 'localhost' 

with self.app.app_context(): 
    url = url_for(..., _external=False) 

self.client.get(url, ...)