Mocking
- Okunuşu
- moking
Kısaca
Mocking, kodu yalıtılmış biçimde test etmek için veritabanı ya da API gibi gerçek bir bağımlılığı kontrol ettiğiniz bir sahteyle değiştiren test tekniğidir.
Mocking nedir?
Mocking, test ettiğiniz kodun gerçek bir bağımlılığını, tamamen sizin kontrolünüzde olan ve mock adı verilen bir vekil nesneyle değiştirmek demektir. Bağımlılık bir veritabanı, bir ödeme API'si, sistem saati ya da bir e-posta servisi olabilir. Mock devredeyken test, gerçek şeye dokunmadan hızlı ve öngörülebilir biçimde çalışır.
Mock, hazır yanıtlarla programlanır; örneğin 42 numaralı kimlik istendiğinde belirli bir kullanıcıyı döndürür, ve nasıl çağrıldığını kaydeder. Böylece test hem kodun sonucunu hem de etkileşimlerini kontrol edebilir; örneğin e-posta servisinin doğru adresle tam olarak bir kez çağrıldığını. Çoğu test çerçevesi mock oluşturmak için yardımcılar içerir ve bağımlılık enjeksiyonu (dependency injection) onları kodun içine vermeyi kolaylaştırır.
Bir uçuş simülatörüne benzer: simülatör tam olarak talimat verildiği gibi davrandığı için pilotlar gerçek bir uçağı riske atmadan acil durumları çalışabilir. Mock'lar birim testlerinde yoğun olarak kullanılır; ağ zaman aşımı gibi gerçekte tetiklenmesi zor hataları simüle etmek ve gerçek bir kredi kartından para çekmek gibi yan etkilerden kaçınmak için de işe yararlar.
Mock, testlerde kullanılan her türlü sahte nesne için genel terim olan test double'ın bir türüdür. Stub yalnızca sabit veri döndürür, fake bellek içi veritabanı gibi daha basit ama çalışan bir uygulamadır, mock ise ayrıca nasıl kullanıldığını da doğrular. Çok fazla mock kullanmak yaygın bir hatadır; çünkü gerçek entegrasyon bozukken bile testler geçebilir, bu yüzden entegrasyon testlerine hâlâ ihtiyaç vardır.
Önemli noktalar
- Mock, gerçek bir bağımlılığı kontrol edilebilir bir sahteyle değiştirir.
- Mock'lar testleri hızlı, tekrarlanabilir ve yan etkisiz kılar.
- Mock'lar yalnızca veri döndürmekle kalmaz, nasıl çağrıldıklarını da doğrulayabilir.
- Stub, fake ve mock'ların hepsi test double türleridir.
- Aşırı mock kullanımı gerçek entegrasyon hatalarını gizleyebilir.
Örnek
import { test, mock } from "node:test";
import assert from "node:assert/strict";
async function welcomeUser(user, emailService) {
await emailService.send(user.email, "Welcome!");
}
test("sends a welcome email", async () => {
const emailService = { send: mock.fn(async () => {}) }; // no real email is sent
await welcomeUser({ email: "ada@example.com" }, emailService);
assert.equal(emailService.send.mock.callCount(), 1);
assert.deepEqual(emailService.send.mock.calls[0].arguments, ["ada@example.com", "Welcome!"]);
});Sık sorulan sorular
Mock ile stub arasındaki fark nedir?
Stub, test edilen kodun çalışabilmesi için yalnızca önceden belirlenmiş veriyi döndürür. Mock ise nasıl çağrıldığını da kaydeder; böylece test, bir metodun çağrılıp çağrılmadığı ve hangi argümanlarla çağrıldığı gibi etkileşimleri doğrulayabilir.
Mock'lar ne zaman kullanılmamalı?
Sahibi olduğunuz basit ve hızlı kodu mock'lamaktan, ayrıca testin yalnızca mock'larınızı kontrol edeceği kadar çok mock kullanmaktan kaçının. Bir veritabanına karşı çalışan sorgular gibi gerçek bileşenlerin birlikte çalıştığını doğrulamak için bunun yerine entegrasyon testleri kullanın.
İlgili sayfalar
- Birim TestiTest ve Kalite, s. 4Birim testi, bir fonksiyonun, metodun ya da sınıfın programın geri kalanından yalıtılmış olarak doğru davrandığını doğrulayan küçük ve otomatik bir kontroldür.
- Entegrasyon TestiTest ve Kalite, s. 7Entegrasyon testi, kod, veritabanı ve API gibi bir sistemin birkaç parçasının birlikte doğru çalışıp çalışmadığını kontrol eden otomatik bir testtir.
- Dependency InjectionYazılım Mimarisi, s. 10Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- Test Odaklı GeliştirmeTest ve Kalite, s. 31Test odaklı geliştirme, önce başarısız bir test yazdığınız, sonra onu geçirecek kadar kod yazıp ardından tasarımı temizlediğiniz bir kodlama pratiğidir.
- APIBackend ve API'ler, s. 2API, bir yazılımın başka bir yazılımdan veri ya da işlem talep etmesini sağlayan, belgelenmiş ve öngörülebilir kurallar bütünüdür.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin