Trung BìnhPython iconPython

Mock vs MagicMock vs AsyncMock — khác nhau gì? Khi nào dùng cái nào?

Mock là base class; MagicMock mở rộng với magic method support (__len__, __iter__, __enter__...); AsyncMock (Python 3.8+) bắt buộc cho coroutine — dùng sai type thì assert_awaited_once sẽ silently pass dù không được await.

python
from unittest.mock import Mock, MagicMock, AsyncMock, patch

# Mock — basic mock object
mock = Mock()
mock.method()           # OK, trả về Mock
mock.method.assert_called_once()

# MagicMock — Mock + magic methods (__len__, __iter__, __enter__ etc.)
magic = MagicMock()
len(magic)              # OK, gọi __len__
with magic:             # OK, gọi __enter__/__exit__
    pass
list(magic)             # OK, gọi __iter__

# AsyncMock (Python 3.8+) — cho async functions
async_mock = AsyncMock(return_value={"data": []})
# await async_mock()  # OK

# Patch context manager
with patch('mymodule.requests.get') as mock_get:
    mock_get.return_value.json.return_value = {'id': 1}
    result = fetch_user(1)
    mock_get.assert_called_once_with('https://api.com/users/1')

# Patch cho async
with patch('mymodule.send_email', new_callable=AsyncMock) as mock_email:
    mock_email.return_value = True
    await register_user("test@test.com")
    mock_email.assert_awaited_once()

# side_effect — simulate exceptions hay dynamic return values
mock.method.side_effect = ValueError("DB connection failed")
mock.method.side_effect = [1, 2, 3]  # Trả về lần lượt

Xem toàn bộ Python cùng filter theo level & chủ đề con.

Mở danh sách Python