61 lines
2.2 KiB
Python
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"
|