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) # 1return_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 ValueErrorspec: 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.environpytest'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 TrueHı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
- İlk pytest Testlerinizi Yazma
- Fixture'lar ve Kurulum/Kapatma
- Parametreleştirme ve Test Kapsamı
- unittest.mock ile Sahte Nesne Kullanımı