Search code examples
pythonpytestpython-decoratorsfixtures

Reuse function as pytest fixture


I have a function in my code that is being used by fastapi to provide a db session to the endpoints:

def get_db() -> Generator[Session, None, None]:
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()

I want to use the same function as a pytest fixture. If I do something like the following, the fixture is not being recognized:

pytest.fixture(get_db, name="db", scope="session")

def test_item_create(db: Session) -> None:
    ...

test_item_create throws an error about db not being a fixture: fixture 'db' not found.

So I can rewrite get_db in my conftest.py and wrap it with pytest.fixture and get things working, but I was wondering if there's a better way of reusing existing functions as fixtures. If I have more helper functions like get_db, it'd be nice not to have rewrite them for tests.


Solution

  • I think pytest cannot find the fixture as things are written in your example. Maybe you are trying to get to something like this?

    db = pytest.fixture(get_db, name="db", scope="session")
    
    def test_item_create(db: Session) -> None:
        ...