49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
"""Simple providers overriding example."""
|
|
|
|
import dataclasses
|
|
import unittest.mock
|
|
|
|
from dependency_injector import containers, providers
|
|
|
|
|
|
class ApiClient:
|
|
...
|
|
|
|
|
|
class ApiClientStub(ApiClient):
|
|
...
|
|
|
|
|
|
@dataclasses.dataclass
|
|
class Service:
|
|
api_client: ApiClient
|
|
|
|
|
|
class Container(containers.DeclarativeContainer):
|
|
|
|
api_client_factory = providers.Factory(ApiClient)
|
|
|
|
service_factory = providers.Factory(
|
|
Service,
|
|
api_client=api_client_factory,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
container = Container()
|
|
|
|
# 1. Use .override() to replace the API client with stub
|
|
container.api_client_factory.override(providers.Factory(ApiClientStub))
|
|
service1 = container.service_factory()
|
|
assert isinstance(service1.api_client, ApiClientStub)
|
|
|
|
# 2. Use .override() as a context manager to mock the API client in testing
|
|
with container.api_client_factory.override(unittest.mock.Mock(ApiClient)):
|
|
service2 = container.service_factory()
|
|
assert isinstance(service2.api_client, unittest.mock.Mock)
|
|
|
|
# 3. Use .reset_override() to get back to normal
|
|
container.api_client_factory.reset_override()
|
|
service3 = container.service_factory()
|
|
assert isinstance(service3.api_client, ApiClient)
|