0Pricing
Python Academy · Pelajaran

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() == 42

Memastikan 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)  # 1

return_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 ValueError

spec: 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.environ

Mock 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 True

Pemeriksaan 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

  1. Menulis Test pytest Pertama Anda
  2. Fixture dan Penyiapan/Pembongkaran
  3. Parameterisasi dan Cakupan Test
  4. Mocking dengan unittest.mock
← Kembali ke Python Academy