-
-
Notifications
You must be signed in to change notification settings - Fork 322
/
Copy pathoverriding.py
48 lines (31 loc) · 1.23 KB
/
overriding.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""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)