# pytest-mock을 사용한 고급 Mock 예제 import pytest from unittest.mock import patch, MagicMock, AsyncMock from datetime import datetime class TestAdvancedMocking: """고급 Mock 패턴 예제""" def test_with_datetime_mock(self): """datetime을 mock하는 예제""" with patch('datetime.datetime') as mock_datetime: mock_datetime.now.return_value = datetime(2024, 1, 1, 12, 0, 0) mock_datetime.side_effect = lambda *args, **kw: datetime(*args, **kw) # 테스트 코드 from datetime import datetime assert datetime.now().year == 2024 def test_with_context_manager_mock(self): """Context manager를 mock하는 예제""" mock_file = MagicMock() mock_file.__enter__.return_value.read.return_value = "file content" with patch('builtins.open', return_value=mock_file): with open('test.txt', 'r') as f: content = f.read() assert content == "file content" @pytest.mark.asyncio async def test_async_function_mock(self): """비동기 함수를 mock하는 예제""" mock_service = AsyncMock() mock_service.get_data.return_value = {"status": "success"} result = await mock_service.get_data() assert result["status"] == "success" def test_side_effect_with_exception(self): """side_effect로 예외를 발생시키는 예제""" mock_func = MagicMock() mock_func.side_effect = ValueError("테스트 에러") with pytest.raises(ValueError, match="테스트 에러"): mock_func() def test_multiple_return_values(self): """여러 번 호출 시 다른 값을 반환하는 예제""" mock_func = MagicMock() mock_func.side_effect = [1, 2, 3] assert mock_func() == 1 assert mock_func() == 2 assert mock_func() == 3 def test_property_mock(self): """Property를 mock하는 예제""" mock_obj = MagicMock() type(mock_obj).name = PropertyMock(return_value="Test Name") assert mock_obj.name == "Test Name"