Mock, testin en faydalı ve en yalancı aracıdır. Ağ beklemeyi, veritabanı bağlantısını, harici servisleri keserek saniyeler kazandırır; ama kazandığınız hızın bedelini, test ile gerçek dünya arasındaki farktan ödersiniz. Bu farkın büyüdüğü yerde testler yeşile döner, üretim ise kırmızıya kalır.
Ne zaman yalan söyler?
İlk tuzak, sahtesini kurduğunuz servisi tam anlamamaktır. Bir ödeme aracısını mock'larken yalnızca mutlu yolu biliyorsanız, bekleme süresi, tekrar deneme ve zaman aşımı senaryoları testlerinizde var olmaz. İkinci tuzak, mock'u davranışı öğrenmek için değil, sonucu doğrulamak için kullanmaktır: expect(mock).toHaveBeenCalledWith(...) yalnızca sizin hayalinizi test eder, servisin gerçek sözleşmesini değil.
// Kırılgan: uygulamanın değil, taklidin sözleşmesini doğruluyor
it("fatura oluşturur", async () => {
const odeme = vi.fn().mockResolvedValue({ status: 200, id: "f1" });
const sonuc = await faturaOlustur({ kullanici: 7, odeme });
expect(odeme).toHaveBeenCalledWith({ kullanici: 7, tutar: 100 });
expect(sonuc.no).toBe("F-1");
});
Bu testte kod ne derse desin fatura numarası hep "F-1" gelir; çünkü servisin numaralandırma kuralını siz söylettiniz, servise söylettirmediniz. Üçüncü tuzak sürüm uyumsuzluğu. Harici servisin şeması değiştiğinde mock'unuz eski şemada yaşamaya devam eder, bütün testler geçer, üretim patlar. Çünkü mock dünyası, gerçek dünyayı dinlemeyi bırakmıştır. Dördüncü tuzak daha sinsidir: mock'a gerçek davranışı sonradan öğretmek. Mock'unuz gerçek servisi taklit etmek için büyüdükçe, artık kendisi de bakım gereken bir bağımlılığa dönüşür — üstelik gerçek olmayan.
Gerçekliğe kulp
Mock'u yalancı olmaktan kurtarmanın yolu, onu gerçekle bağlamaktır. Sözleşme testleri yazın: geliştirme ortamında gerçek servise bir kez bağlanıp dönen cevabı şema olarak kaydedin, mock'unuz bu şemayı izlesin. Şema değişirse sözleşme testi kırılır, haberiniz olmadan keşfedersiniz.
// Sahte sunucu, gerçek şemadan doğrulanır
it("ödeme servisi sözleşmesi", async () => {
const ornek = await gercekOrnekCevap(); // sadece CI'da
expect(() => OdemeCevabi.parse(ornek)).not.toThrow();
});
İkinci kulps, hangi katmanda sahtecilik yapacağınızı bilmektir. Ağ katmanını değil, kendi sınırınızı sahteleştirin: repository'nizi mock'layın, HTTP istemcinizi değil. Böylece sahtecilik sizin sözleşmenizde kalır, üçüncü tarafın detayına sızamaz.
Sonuç: mock bir araçtır, dünya görüşü değil. Sahte dünyayı kurmadan önce, gerçek dünyanın hangi parçasını yansıttığını ve hangi parçayı atlayacağınızı bilin. Ne kadar sahte, o kadar yalancı — denklemi küçük dozlarda deneyin ve her sahteciliğin bir sözleşme testiyle denetlendiğinden emin olun. Pratikte işe yarayan oran, mock'suz bırakılan her bir sınır için iki kat bedel ödemektir: bir sözleşme testi, bir de gerçek bağımlılıkla dönen entegrasyon testi. Bu denge kurulduğunda mock hızını alırsınız, yalanını alamazsınız.
Sözlük küçük, ders büyük
Mock dünyasının sağlığı, sözlüğünün küçüklüğündedir: kaç bağımlılık sahteleştiriliyor, kaçı gerçek? Bu sorunun cevabı projeden projeye değişmez; kurallar şudur — birim testinde sahtecilik serbesttir, entegrasyon testinde sınırlıdır, uçtan uca testte yasaktır. Katman değiştikçe gerçekliğin payı artar, hız azalır. Mock'un görevi bu merdivende hız ile gerçeklik arasında yer temin etmektir; kendine dünya kurup oraya yerleşen mock, kastettiğimiz yalancıdır.
Okur Yorumları (0)