Advanced Testing Patterns
Test doubles, mocking strategies, and test organization.
Overview
Master advanced testing techniques.
Test Doubles
from unittest.mock import Mock, MagicMock, patch
# Stub - returns predefined values
stub = Mock(return_value="stubbed response")
# Spy - records calls
spy = Mock()
result = spy("arg")
spy.assert_called_once_with("arg")
# Mock - replaces real objects
mock_db = MagicMock()
mock_db.users.find.return_value = [{"name": "Alice"}]
Mocking Strategies
# Patch at the right level
@patch('myapp.services.requests')
def test_api_call(mock_requests):
mock_requests.get.return_value.status_code = 200
mock_requests.get.return_value.json.return_value = {"data": "test"}
result = fetch_data("https://api.example.com")
assert result == {"data": "test"}
# Context manager mocking
with patch('myapp.utils.datetime') as mock_dt:
mock_dt.now.return_value = datetime(2024, 1, 1)
assert get_current_date() == "2024-01-01"
Test Organization
import pytest
class TestUserService:
@pytest.fixture(autouse=True)
def setup(self):
self.service = UserService()
def test_create_user(self):
user = self.service.create("Alice")
assert user.name == "Alice"
def test_find_user(self):
self.service.create("Alice")
user = self.service.find("Alice")
assert user is not None
# Parameterized tests
@pytest.mark.parametrize("input,expected", [
(1, 2),
(2, 4),
(3, 6),
])
def test_double(input, expected):
assert double(input) == expected
Practice
Write comprehensive tests for a complex service layer.