Overriding

Dependency overriding is a feature that allows you to override dependency or its result.

You can override either:

Dependency result — the dependency callable will not be executed; instead, the provided value will be used.

Dependency callable — you can override one dependency with another

Overriding result:

override={require_user: test_user} → FunDI will skip calling require_user and use test_user instead.

Overriding callable:

override={require_user: scan(mock_user_func)} → FunDI will call mock_user_func instead of require_user.

Example of overriding dependency result:

from fundi import Scope, scan, inject

from src import application
from src.models import User
from src.dependencies import require_user


test_user = User(
    id="test-id",
    username="test_user",
)

inject(Scope({"username": test_user.username}), scan(application), override={require_user: test_user})

Example of overriding dependency callable:

from contextlib import ExitStack

from fundi import Scope, scan, inject

from src import application
from src.models import User
from src.dependencies import require_user


test_user = User(
    id="test-id",
    username="test_user",
)


def test_require_user() -> User:
    return test_user


inject(
    Scope({"username": test_user.username}),
    scan(application),
    override={require_user: scan(test_require_user)}
)