Jeff Widman
Jeff Widman

Reputation: 23522

How to test that Flask is using test_client rather than client?

I'm using Pytest fixtures with Flask. My application is instantiated using an application factory.

#conftest.py

@pytest.fixture(scope='session')
def app(request):
    '''Session-wide test application'''
    app = create_app('testing')
    app.client = app.test_client()
    app_context = app.app_context()
    app_context.push()


    def teardown():
        app_context.pop()

    request.addfinalizer(teardown)
    return app

I wanted to verify that the app created by my fixture uses Flask's built-in test_client, so I wrote a test:

#test_basics.py

def test_app_client_is_testing(app):
    assert app.client() == app.test_client()

When I run this test, I get: TypeError: 'FlaskClient' object is not callable

What am I doing wrong?

Is the test incorrect, or is the fixture incorrect?

Upvotes: 1

Views: 3578

Answers (1)

davidism
davidism

Reputation: 127310

app.client is already an instance, you shouldn't call it again. Ultimately, this test makes no sense. Of course client is a test client, that's how you just created it in the fixture. Also, the clients will never be equal, they are different instances.

from flask.testing import FlaskClient

assert app.client == app.test_client()  # different instances, never true
assert isinstance(app.client, app.test_client_class or FlaskClient)  # still pointless, but correct

What you probably want is two fixtures: app and client, rather than creating a client on the app.

@pytest.yield_fixture
def app():
    a = create_app('testing')
    a.testing = True

    with a.app_context():
        yield a

@pytest.yield_fixture
def client(app):
    with app.test_client() as c:
        yield c

from flask.testing import FlaskClient

def test_app_client_is_client(app, client):
    # why?
    assert isinstance(client, app.test_client_class or FlaskClient)

Upvotes: 4

Related Questions