0Pricing
Python Academy · Ders

unittest.mock ile Sahte Nesne Kullanımı

Bağımlılıkları sahte nesnelerle değiştirerek test edilen birimleri yalıtın.

unittest.mock ile Sahte Nesne Kullanımı, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Neden Mock?

Taklitler, sınamaların hızlı, tutarlı ve yalıtılmış çalışması için gerçek bağımlılıkların (veritabanları, API'ler, dosya sistemi) yerini denetlenebilir sahte nesnelerle değiştirir.

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 ve MagicMock

Mock temel sınıftır. MagicMock, sihirli veya çift alt çizgili metotları otomatik olarak yapılandırır; böylece yineleyici, bağlam yöneticisi ve benzeri yapılar olarak kullanılabilir.

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)

Dekoratör Olarak patch

Sınama süresince bir modüldeki nesneyi taklitle değiştirmek için @patch kullanın.

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

Bağlam Yöneticisi Olarak patch

Daha yerel kapsamlı taklitler için patch() işlevini bağlam yöneticisi olarak kullanın.

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), mevcut bir nesne veya sınıftaki belirli bir özniteliğe yama uygular.

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

Çağrıları Doğrulama

Taklitler her çağrıyı kaydeder. Davranışı doğrulamak için assert_called_once_with, assert_called_with ve call_count kullanın.

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 ve side_effect

Taklidin ne döndüreceğini denetlemek için return_value ayarını yapın. İstisnalar oluşturmak veya art arda yapılan çağrılarda farklı değerler döndürmek için side_effect kullanın.

from unittest.mock import Mock

m = Mock(side_effect=[1, 2, ValueError("done")])
print(m())  # 1
print(m())  # 2
m()         # raises ValueError

spec: Tür Güvenli Taklitler

Taklidi yalnızca gerçek sınıfta bulunan özniteliklerle sınırlamak için spec=MyClass aktarın.

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

Bir sözlüğü (örneğin ortam değişkenlerini veya modül düzeyindeki yapılandırmaları) geçici olarak değiştirmek için patch.dict kullanın.

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

pytest'te Mock ile pytest-mock Kullanımı

pytest-mock, unittest.mock işlevini saran ve her sınamadan sonra temizleme işlemini otomatik olarak yapan bir mocker fikstürü sağlar.

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

Eş Yordamlar için AsyncMock

Beklenen asenkron işlevleri taklit etmek için AsyncMock kullanın.

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

Hızlı Kontrol

Bir Mock çağrıldığında hangi değeri döndüreceğini denetlemek için hangi özniteliği ayarlarsınız?

Özet

unittest.mock; Mock, MagicMock, patch ve AsyncMock sağlar. Davranışı denetlemek için return_value ve side_effect kullanın; taklitlerin nasıl çağrıldığını doğrulamak için doğrulama metotlarından yararlanın.

Sıkça Sorulan Sorular

“unittest.mock ile Sahte Nesne Kullanımı” dersi ücretsiz mi?

Evet — “unittest.mock ile Sahte Nesne Kullanımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“unittest.mock ile Sahte Nesne Kullanımı” dersinde ne öğreneceğim?

Bağımlılıkları sahte nesnelerle değiştirerek test edilen birimleri yalıtın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“unittest.mock ile Sahte Nesne Kullanımı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İlk pytest Testlerinizi Yazma
  2. Fixture'lar ve Kurulum/Kapatma
  3. Parametreleştirme ve Test Kapsamı
  4. unittest.mock ile Sahte Nesne Kullanımı
← Python Academy Sayfasına Dön