Mocking in Tests
Mocking isolates code under test by replacing dependencies with fake objects. Essential for testing external APIs, databases, and slow operations.
💻 Mock Basics
from unittest.mock import Mock, patch
# Create mock object
mock_api = Mock()
mock_api.get_data.return_value = {'status': 'success'}
result = mock_api.get_data()
assert result == {'status': 'success'}
mock_api.get_data.assert_called_once()
# Mock with patch decorator
@patch('requests.get')
def test_fetch_data(mock_get):
mock_get.return_value.json.return_value = {'data': 'test'}
response = fetch_data('https://api.example.com')
assert response == {'data': 'test'}
mock_get.assert_called_with('https://api.example.com')🔧 Advanced Mocking
# Mock side effects
mock_api = Mock()
mock_api.get_data.side_effect = [1, 2, 3]
assert mock_api.get_data() == 1
assert mock_api.get_data() == 2
# Mock attributes
mock_user = Mock()
mock_user.name = 'Alice'
mock_user.age = 30
# Context manager mocking
with patch('builtins.open', mock_open(read_data='test')) as m:
with open('file.txt') as f:
content = f.read()
assert content == 'test'🎯 Key Takeaways
- Mock(): Create mock objects
- @patch: Replace dependencies
- return_value: Set mock return value
- side_effect: Multiple returns or exceptions
- assert_called: Verify mock was called
- Isolation: Test without external dependencies