O2Sound_ver2_final/backend/tests/test_mock_examples.py

61 lines
2.2 KiB
Python

# 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"