Python
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.
Örnek çözümü göster
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")
Kendini test et
-
patch decorator'ünü ekle
from unittest.mock import patch
@____("mymodule.fetch")
def test_fetch(mock_fetch):
mock_fetch.return_value = 200
Cevabı göster
from unittest.mock import patch
@patch("mymodule.fetch")
def test_fetch(mock_fetch):
mock_fetch.return_value = 200
-
patch kullanım biçimlerini eşleştir
- @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
-
@patch decorator'ü test fonksiyonuna ne enjekte eder?
- Hedefin gerçek nesnesini
- Hata fırlatır
- Boş bir None
- Hedefi değiştiren Mock nesnesini
Cevabı göster
Hedefi değiştiren Mock nesnesini — patch, test fonksiyonuna hedefi değiştiren Mock nesnesini enjekte eder.
Sıradaki ders: MagicMock