From 4f111aae9b0b000d1bc1d2ab01d6052297ca4d1c Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Thu, 3 Sep 2020 17:42:15 -0400 Subject: [PATCH] Update provider overriding example to use container and fix bug --- examples/providers/overriding.py | 36 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/examples/providers/overriding.py b/examples/providers/overriding.py index 42c01de5..9627667c 100644 --- a/examples/providers/overriding.py +++ b/examples/providers/overriding.py @@ -1,8 +1,9 @@ """Simple providers overriding example.""" +import dataclasses import unittest.mock -from dependency_injector import providers +from dependency_injector import containers, providers class ApiClient: @@ -13,30 +14,35 @@ class ApiClientStub(ApiClient): ... +@dataclasses.dataclass class Service: - def __init__(self, api_client: ApiClient): - self._api_client = api_client + api_client: ApiClient -api_client_factory = providers.Factory(ApiClient) -service_factory = providers.Factory( - Service, - api_client=api_client_factory, -) +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 - api_client_factory.override(providers.Factory(ApiClientStub)) - service1 = service_factory() + 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 api_client_factory.override(unittest.mock.Mock(ApiClient)): - service3 = service_factory() - assert isinstance(service3.api_client, unittest.mock.Mock) + 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 - api_client_factory.reset_override() - service3 = service_factory() + container.api_client_factory.reset_override() + service3 = container.service_factory() assert isinstance(service3.api_client, ApiClient)