Mocking dengan unittest.mock
Pisahkan unit yang sedang diuji dengan melakukan mocking pada dependensi.
Mocking dengan unittest.mock adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Mengapa Menggunakan Mock?
Mock menggantikan dependensi nyata (basis data, API, sistem berkas) dengan tiruan yang dapat dikendalikan agar pengujian berjalan cepat, deterministik, dan terisolasi.
from unittest.mock import Mock
api = Mock()
api.get_user.return_value = {"id": 1, "name": "Alice"}
result = api.get_user(1)
print(result) # {'id': 1, 'name': 'Alice'}Mock dan MagicMock
Mock adalah kelas dasar. MagicMock secara otomatis mengonfigurasi metode magic/dunder sehingga dapat digunakan sebagai iterator, pengelola konteks, dan sebagainya.
from unittest.mock import MagicMock
m = MagicMock()
m.__len__.return_value = 5
print(len(m)) # 5
m.__iter__.return_value = iter([1, 2, 3])
for x in m:
print(x)patch sebagai Dekorator
Gunakan @patch untuk mengganti objek dalam modul dengan mock selama pengujian berlangsung.
from unittest.mock import patch
def get_data():
import requests
return requests.get("https://api.example.com").json()
@patch("requests.get")
def test_get_data(mock_get):
mock_get.return_value.json.return_value = {"key": "value"}
result = get_data()
assert result == {"key": "value"}patch sebagai Pengelola Konteks
Gunakan patch() sebagai pengelola konteks untuk mocking yang lebih terlokalisasi.
from unittest.mock import patch
def test_open():
with patch("builtins.open", create=True) as mock_open:
mock_open.return_value.__enter__.return_value.read.return_value = "data"
with open("file.txt") as f:
assert f.read() == "data"patch.object
patch.object(target, attribute) menambal atribut tertentu pada objek atau kelas yang sudah ada.
from unittest.mock import patch
import mymodule
def test_method():
with patch.object(mymodule.MyClass, "fetch", return_value=42):
obj = mymodule.MyClass()
assert obj.fetch() == 42Memastikan Pemanggilan
Mock mencatat setiap pemanggilan. Gunakan assert_called_once_with, assert_called_with, dan call_count untuk memverifikasi perilaku.
from unittest.mock import Mock
send = Mock()
send("hello", to="alice")
send.assert_called_once_with("hello", to="alice")
print(send.call_count) # 1return_value dan side_effect
Atur return_value untuk mengendalikan nilai yang dikembalikan mock. Gunakan side_effect untuk memunculkan pengecualian atau mengembalikan nilai yang berbeda pada pemanggilan berturut-turut.
from unittest.mock import Mock
m = Mock(side_effect=[1, 2, ValueError("done")])
print(m()) # 1
print(m()) # 2
m() # raises ValueErrorspec: Mock dengan Keamanan Tipe
Teruskan spec=MyClass untuk membatasi mock hanya pada atribut yang ada di kelas nyata.
from unittest.mock import Mock
class Calc:
def add(self, a, b): return a + b
m = Mock(spec=Calc)
m.add(1, 2) # OK
# m.subtract(1, 2) # AttributeError: Mock does not have 'subtract'patch.dict
Gunakan patch.dict untuk mengubah kamus sementara (misalnya, variabel lingkungan atau konfigurasi tingkat modul).
from unittest.mock import patch
import os
def test_env():
with patch.dict(os.environ, {"DEBUG": "true"}):
assert os.environ["DEBUG"] == "true"
assert "DEBUG" not in os.environMock dalam pytest dengan pytest-mock
pytest-mock menyediakan fixture mocker yang membungkus unittest.mock dan otomatis melakukan pembersihan setelah setiap pengujian.
# pip install pytest-mock
def test_service(mocker):
mocker.patch("mymodule.requests.get", return_value=mocker.Mock(
json=lambda: {"status": "ok"}
))
from mymodule import call_api
assert call_api()["status"] == "ok"AsyncMock untuk Coroutine
Gunakan AsyncMock untuk melakukan mocking pada fungsi asinkron yang ditunggu dengan await.
from unittest.mock import AsyncMock, patch
import asyncio
async def fetch():
import httpx
async with httpx.AsyncClient() as c:
r = await c.get("https://example.com")
return r.json()
def test_fetch():
with patch("httpx.AsyncClient.get", new_callable=AsyncMock) as m:
m.return_value.json.return_value = {"ok": True}
result = asyncio.run(fetch())
assert result["ok"] is TruePemeriksaan Singkat
Atribut apa yang Anda atur pada Mock untuk mengendalikan nilai yang dikembalikannya saat dipanggil?
Ringkasan
unittest.mock menyediakan Mock, MagicMock, patch, dan AsyncMock. Gunakan return_value dan side_effect untuk mengendalikan perilaku, lalu gunakan metode assertion untuk memverifikasi cara mock dipanggil.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mocking dengan unittest.mock” gratis?
Ya — teks lengkap “Mocking dengan unittest.mock” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mocking dengan unittest.mock”?
Pisahkan unit yang sedang diuji dengan melakukan mocking pada dependensi. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mocking dengan unittest.mock” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menulis Test pytest Pertama Anda
- Fixture dan Penyiapan/Pembongkaran
- Parameterisasi dan Cakupan Test
- Mocking dengan unittest.mock