mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			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)
 |