11 / 12
Hata Ayıklama
screen.debug, sık hatalar ve coverage.
Test kırıldığında ne yapmalı?
Hata mesajını okuyun. Testing Library, bir sorgu başarısız olunca o anki DOM'u hata mesajıyla birlikte yazar.1 Aşağıdaki sıra çoğu sorunu çözer:
Hata mesajının ilk satırını okuyun.
screen.debug()ile DOM'a bakın.Sorgu listesine bakın. Mesajdaki accessible roles bölümü size gerçek rolleri gösterir.2
Sorguyu veya testi düzeltin.
screen.debug: DOM'a bakın
screen.debug() o andaki DOM'u konsola yazar.1 Testin geçtiği veya kırıldığı noktada ekranda ne olduğunu görürsünüz.
test("ürün listesi", async () => {
render(<ProductList loadProducts={loadProducts} onAddToCart={vi.fn()} />);
screen.debug();
await screen.findAllByRole("article");
screen.debug(screen.getByRole("article", { name: "Mekanik Klavye" }));
});Argümansız çağrı tüm sayfayı, argümanlı çağrı yalnızca verdiğiniz elemanı yazar.1
Tip
Sorunu çözdükten sonra screen.debug() satırlarını silin.
logRoles(container): bir elemanın içindeki tüm örtük (implicit) ARIA rollerini ve her rolü taşıyan elemanları yazar.@testing-library/reactpaketinden de import edilir.1, 3screen.logTestingPlaygroundURL(): o anki DOM için bir Testing Playground bağlantısı yazar. Bağlantıda en iyi sorguyu seçebilirsiniz.1Debug çıktısı varsayılan olarak 7000 karakterde kesilir. Uzun DOM'larda
DEBUG_PRINT_LIMITortam değişkenini artırın:DEBUG_PRINT_LIMIT=20000 pnpm vitest run(macOS ve Linux; Windows'tacross-envkullanın).1
En sık görülen 4 hata
1. Found multiple elements
TestingLibraryElementError: Found multiple elements with the role "button" and name "Sepete ekle"Sebep: Sayfada aynı sorguya uyan birden fazla eleman var. Her ürün kartında bir Sepete ekle butonu bulunur.4
Çözüm: Aramayı within ile bir karta daraltın.5 Tüm elemanlar gerekiyorsa getAllByRole kullanın.4
const card = screen.getByRole("article", { name: "Mekanik Klavye" });
within(card).getByRole("button", { name: "Sepete ekle" });2. Unable to find an accessible element
TestingLibraryElementError: Unable to find an accessible element with the role "heading" and name "Klavye"
Here are the accessible roles:
region:
searchbox:
article:
heading:
button:Sebep: Sorgu eleman bulamadı. Rol, isim veya yazım yanlış olabilir. Veya eleman henüz ekranda değildir.
Mesajdaki rol listesine bakın. Aradığınız rol listede var mı?2
namedeğerini kontrol edin. Tam eşleşme gerekir:"Klavye"değil"Mekanik Klavye". Kısmi eşleşme için regex kullanın:/klavye/i.6, 4Eleman sonradan geliyorsa
findBykullanın.4
3. Eleman henüz ekranda değil
TestingLibraryElementError: Unable to find an accessible element with the role "article"
Here are the accessible roles:
status:Sebep: Ürünler API'den sonra gelir. Test, yükleme bitmeden kontrol yapmıştır. Rol listesinde yalnızca status (yükleme mesajı) görünür.
Çözüm: getBy yerine await screen.findBy kullanın.7
4. not wrapped in act(...)
An update to ProductList inside a test was not wrapped in act(...).Sebep: Component, test bittikten veya test beklemeyi bırakmışken state'ini güncelledi. Genellikle bir asenkron işlem tamamlanmadan test sona erer.8
Testin sonunda, beklediğiniz sonucu
await findByveyaawait waitForile bekleyin.8Zamanlayıcı kullanıyorsanız
vi.advanceTimersByTimeçağrısınıactiçine alın.8
Warning
act uyarısını console.error susturarak gizlemeyin. Uyarı, testin eksik beklediğini gösterir.8
Yaygın hatalar
| Hata | Doğrusu |
|---|---|
Yokluğu getBy ile kontrol etmek | queryBy kullanın.4 |
userEvent çağrısına await yazmamak | Her user.* çağrısına await yazın.9 |
vi.useFakeTimers() sonrası findBy ile takılmak | vi.useFakeTimers({ shouldAdvanceTime: true })10, 11 |
Göreli URL ile fetch çağırmak | Tam URL kullanın: https://api.magaza.test/products. Göreli URL, test ortamına göre Failed to parse URL hatası verebilir.12, 13 |
| Testin bir önceki testten kalan veriye bağlı olması | Her test kendi verisini kursun.14 |
Tek testi çalıştırma
Tüm testleri çalıştırmayın. Üzerinde çalıştığınız testi seçin:
pnpm vitest run src/ProductList.test.tsx
pnpm vitest run src/ProductList.test.tsx -t "aramaya göre"-t seçeneği, adı verilen ifadeyle eşleşen testleri çalıştırır (ifade regex olarak okunur). Geliştirme sırasında pnpm vitest (izleme modu) kullanın. Dosya değişince testler yeniden çalışır.15
Coverage
Coverage, testlerin kodun ne kadarını çalıştırdığını gösterir. Kodun test edilmeyen kısımlarını bulmak için kullanın.16
pnpm add -D @vitest/coverage-v8
pnpm vitest run --coverageTesti olmayan dosyaları da rapora eklemek için vitest.config.ts dosyasına include ekleyin:17
test: {
coverage: {
provider: "v8",
include: ["src/**/*.{ts,tsx}"],
},
},Warning
%100 coverage hedeflemeyin. Coverage, testin doğru olduğunu göstermez. Yalnızca kodun çalıştığını gösterir. Önemli akışlara (sepete ekleme, ödeme, form doğrulama) odaklanın.16
Kendin dene
Aşağıdaki test kırılıyor. Hata mesajını okuyarak düzeltin:
test("ürünü sepete ekler", async () => {
const user = userEvent.setup();
const onAddToCart = vi.fn();
render(
<ProductList
loadProducts={() => Promise.resolve(products)}
onAddToCart={onAddToCart}
/>,
);
await user.click(screen.getByRole("button", { name: "Sepete ekle" }));
expect(onAddToCart).toHaveBeenCalledTimes(1);
});Testi çalıştırın ve ilk hata mesajını okuyun.
Hata mesajındaki rol listesine bakın.
Önce yüklenmeyi bekleyin. Sonra Mekanik Klavye kartında
withinile butonu bulun.
Kaynaklar
Otomatik DOM çıktısı, `screen.debug`, `logRoles`, `logTestingPlaygroundURL` ve `DEBUG_PRINT_LIMIT`.
"Accessible roles" çıktısı ve yanlış sorgu kalıpları. İlkeler geçerli, `userEvent` örnekleri `setup()` öncesi sürümden.
DOM Testing Library'nin tamamı yeniden dışa aktarılır.
`getBy`, `queryBy` ve `findBy` farkı, `TextMatch`.
`within` ile sorguyu bir elemana daraltma.
`name` seçeneği.
`findBy` sorguları.
Uyarının sebebi ve çözümleri. Örnekler Jest ile yazılmış.
`userEvent.setup()` ve `await user.click(...)`.
Vitest'te `findBy` timeout'a düşer.
`shouldAdvanceTime` seçeneği.
Test ortamında göreli URL'lerin `Failed to parse URL` hatası verebilmesi.
Göreli `fetch` URL'lerinin jsdom'da çözülmesi MSW 2.1.5'te düzeltildi.
Testler arasında paylaşılan durumun sorunları.
`vitest run`, `-t` ve izleme modu.
Coverage hedef değil, test edilmeyen yerleri bulma aracıdır.
Kurulum ve `coverage.include`.
Last updated: October 14, 2026
