2016-07-23 33 views
1

Ich versuche, eine Anwendung mit Pytest und einer App-Factory zu testen, aber ich kann anscheinend nicht auf das Clientsitzungsobjekt in meinen Tests zugreifen. Ich bin mir sicher, dass es irgendwo einen Zusammenhang gibt, den ich nicht dränge. Ich schiebe den App-Kontext in meine App-Appliance. Soll ich den Anfragekontext irgendwo hinschieben?Zugriff auf Flask-Test-Client-Sitzung im Pytest-Test bei Verwendung einer App-Factory

Das Folgende ist ein MWE.

mwe.py:

from flask import Flask, session 


def create_app(): 
    app = Flask(__name__) 
    app.secret_key = 'top secret' 

    @app.route('/set') 
    def session_set(): 
     session['key'] = 'value' 
     return 'Set' 

    @app.route('/check') 
    def session_check(): 
     return str('key' in session) 

    @app.route('/clear') 
    def session_clear(): 
     session.pop('key', None) 
     return 'Cleared' 

    return app 


if __name__ == "__main__": 
    mwe = create_app() 
    mwe.run() 

conftest.py:

import pytest 
from mwe import create_app 


@pytest.fixture(scope='session') 
def app(request): 
    app = create_app() 

    ctx = app.app_context() 
    ctx.push() 

    def teardown(): 
     ctx.pop() 

    request.addfinalizer(teardown) 
    return app 


@pytest.fixture(scope='function') 
def client(app): 
    return app.test_client() 

test_session.py:

import pytest 
from flask import session 


def test_value_set_for_client_request(client): # PASS 
    client.get('/set') 
    r = client.get('/check') 
    assert 'True' in r.data 


def test_value_set_in_session(client): # FAIL 
    client.get('/set') 
    assert 'key' in session 


def test_value_set_in_session_transaction(client): # FAIL 
    with client.session_transaction() as sess: 
     client.get('/set') 
     assert 'key' in sess 

Beachten Sie, dass ru Dies funktioniert direkt, ich kann springen/setzen,/überprüfen,/löschen und es verhält sich wie erwartet. In ähnlicher Weise funktioniert der Test, der nur den Testclient zum Abrufen der Seiten verwendet, wie erwartet. Der direkte Zugriff auf die Sitzung scheint dies jedoch nicht zu tun.

Antwort

0

Werfen Sie einen Blick von conftest.py in Cookiecutter-Kolben. Es kann Ihnen einige Ideen geben.

@pytest.yield_fixture(scope='function') def app(): 
    """An application for the tests.""" 
    _app = create_app(TestConfig) 
    ctx = _app.test_request_context() 
    ctx.push() 

    yield _app 

    ctx.pop() 


@pytest.fixture(scope='function') def testapp(app): 
    """A Webtest app.""" 
    return TestApp(app) 
0

Das Problem ist mit der Art und Weise Sie Ihren Test-Client verwenden.

Zunächst müssen Sie Ihr Client-Gerät nicht erstellen. Wenn Sie pytest-flask verwenden, bietet es eine client zu verwendende Vorrichtung an. Wenn Sie dennoch Ihren eigenen Client verwenden möchten (z. B. weil Sie nicht wollen pytest-flask), sollte Ihr Client Fixture als ein Kontext-Prozessor fungieren, um Ihre Anforderungen herum zu wickeln.

Sie müssen also in etwa wie folgt:

def test_value_set_in_session(client): 
    with client: 
     client.get('/set') 
     assert 'key' in session 

Informationen des Tages: pytest-Kolben eine ähnliche Client Halterung zu verkaufen hat. Der Unterschied besteht darin, dass pytest-Kolben einen Kontext-Manager verwendet Sie einen Client zu geben und das spart Ihnen 1 Zeile pro Test

@pytest.yield_fixture 
def client(app): 
    """A Flask test client. An instance of :class:`flask.testing.TestClient` 
    by default. 
    """ 
    with app.test_client() as client: 
     yield client 

Ihren Test mit pytest-flaskclient

def test_value_set_in_session(client): 
    client.get('/set') 
    assert 'key' in session