�� Mocking

Test Isolation & Mocks

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