user11419808
user11419808

Reputation:

How to pass arguments to a pytest fixture?

I'd like to create a session with specific user email and password, for that I need to pass these two pieces of information to a pytest fixture as arguments.

My attempt to do so:

from pytest import fixture
from api_methods import ApiMethods


@fixture(scope="session")
def user_session():

    def _update_credentials(email, password):
        user_credentials = {
            "email": email,
            "password": password
        }
        return user_credentials

    session = ApiMethods()
    session.get_authorized(_update_credentials)
    return session

The problem is that _update_credentials returns a function object instead of JSON, which raises TypeError: Object of type function is not JSON serializable

What sould I do to provide email and password to this fixture correctly? Help me, please :)

Upvotes: 0

Views: 2774

Answers (1)

Marco.S
Marco.S

Reputation: 433

What it seems you're trying to do is to use the factory as fixture pattern like this:

from pytest import fixture
from api_methods import ApiMethods


@fixture(scope="session")
def update_credentials():
    def _update_credentials(email, password):
        user_credentials = {
            "email": email,
            "password": password
        }
        return user_credentials

    return _update_credentials


@fixture(scope="session")
def user_session(update_credentials):
    user_credentials = update_credentials("email1", "password1")
    session = ApiMethods()
    session.get_authorized(user_credentials)

    return session

But it seems you could just do this instead:

from pytest import fixture
from api_methods import ApiMethods


@fixture(scope="session")
def user_session():
    user_credentials = {
        "email": email,
        "password": password
    }
    session = ApiMethods()
    session.get_authorized(user_credentials)

    return session

Upvotes: 2

Related Questions