patch
- Python kursu
- İleri seviye
- Ders 20/83
- 5 dk
@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
# 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
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
from unittest.mock import patch
@____("mymodule.fetch")
def test_fetch(mock_fetch):
mock_fetch.return_value = 200
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.