CodeBlanks Logo Icon CodeBlanks

patch

@patch ile yamalamayı öğrenirsin.

patch

patch, bir nesneyi test süresince başka bir Mock ile değiştirir; test bitince otomatik geri yükler. Modüldeki gerçek fonksiyon ya da sınıfı taklit etmek için kullanılır.

Decorator ya da bağlam yöneticisi olarak kullanılır. Decorator biçiminde, test fonksiyonuna bir Mock parametresi enjekte edilir.

from unittest.mock import patch

@patch("mymodule.fetch")
def test_fetch(mock_fetch):
    mock_fetch.return_value = 200
    assert mymodule.fetch() == 200

İlk dize, değiştirilecek nesnenin tam yoludur (ör. mymodule.fetch). Test sonunda gerçek fetch geri yüklenir.

Hedef yolu ve enjeksiyon

patch'in ilk dize argümanı, değiştirilecek hedefin tam yoludur. Örneğin "requests.get" ya da "os.getcwd". Doğru yol verilmelidir; yoksa patch hataya yol açar.

Decorator olarak kullanıldığında, patch en alttaki dekoratörden başlayarak parametreleri enjekte eder. Yani tek patch varsa, Mock test fonksiyonunun ilk parametresine geçer.

Bağlam yöneticisi biçiminde with patch("x") as mock_x: de yazılabilir; bu da aynı işi yapar.

Uygulama patch ile greeting testi

greet(name) fonksiyonu "Merhaba, " + name döndürsün. test_greet(mock_upper) fonksiyonunu @patch("builtins.str") decorator'ü ile süsle. Test gövdesinde mock_upper.return_value = "MERHABA" ayarla; assert greet("x") denetimi ekle. Dosya sonunda test_greet(lambda *a, **k: "MERHABA") çağrısı ve print("ok") olsun.

Başlangıç kodu

main.py
# unittest.mock içinden patch içe aktar
# greet(name): "Merhaba, " + name döndür
# test_greet: @patch decorator'ü ile süsle
# test_greet'i basit bir Mock ile çağır ve "ok" yazdır

Örnek çözüm

main.py
from unittest.mock import patch

def greet(name):
    return "Merhaba, " + name

@patch("builtins.str")
def test_greet(mock_upper):
    mock_upper.return_value = "MERHABA"
    greet("x")
    print("ok")

test_greet(lambda *a, **k: "MERHABA")

Beklenen çıktı

ok

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 patch decorator'ünü ekle

Soru
from unittest.mock import patch

@____("mymodule.fetch")
def test_fetch(mock_fetch):
    mock_fetch.return_value = 200
Cevap
from unittest.mock import patch

@patch("mymodule.fetch")
def test_fetch(mock_fetch):
    mock_fetch.return_value = 200

Açıklama: patch decorator'ü hedefi test sırasında Mock ile değiştirir.

2 patch kullanım biçimlerini eşleştir

Kavram Anlamı
@patch("m.f") Decorator biçimi
with patch("m.f") Bağlam yöneticisi
mock_f.return_value Dönüş değeri
"m.f" Hedef yolu

3 @patch decorator'ü test fonksiyonuna ne enjekte eder?

  • Hedefin gerçek nesnesini
  • Hata fırlatır
  • Boş bir None
  • Hedefi değiştiren Mock nesnesini Doğru cevap

Açıklama: patch, test fonksiyonuna hedefi değiştiren Mock nesnesini enjekte eder.

İleri seviye bölümündeki tüm dersler