Spy — test davomida metod chaqiruvlari, argumentlar, natijalar yoki tartibni qayd etadigan test double. Spy ko‘pincha chaqiruvni haqiqiy implementatsiyaga uzatadi yoki oldindan belgilangan natija beradi, so‘ng test uning qanday ishlatilganini assertion orqali tekshiradi. Mockdan farqi terminologiyada shuki, mock expectationni oldindan markazga qo‘yadi, spy esa bajarilgan interaction tarixini keyin tekshiradi.
Call history
Spy odatda quyidagilarni saqlaydi:
- metod necha marta chaqirilgani;
- har chaqiruvdagi positional va named argumentlar;
- chaqiruvlar ketma-ketligi;
- qaytarilgan qiymat yoki exception;
- async muhitda metod await qilingan-qilinmagani.
Test publish bir marta va kerakli event bilan chaqirilganini tekshirishi mumkin. Faqat chaqiruv soni yetarli bo‘lmasa, eventning muhim maydonlari matcher bilan tasdiqlanadi.
Partial spy
Partial spy real obyektning ayrim metodlarini kuzatib, asli xulqni bajaradi. Bu legacy kodda foydali, ammo haqiqiy metod yon ta’sir — fayl yozish, email yuborish yoki baza o‘zgartirish — qilishi mumkin. call through xatti-harakati aniq bilinmasa, test production amali bajarib yuboradi.
Ayrim metod stub qilinib, qolganlari real qolishi mumkin. Ichki metodni spy qilish refactorga sezgir: algoritm yordamchi metodni boshqa usulda chaqirsa, tashqi natija to‘g‘ri bo‘lsa ham test yiqiladi. Public boundary interactionlari barqarorroq.
Spy va mock farqi
Amaliy frameworklarda bitta obyekt ham spy, stub va mock vazifasini bajarishi mumkin. Kontseptual farq test uslubida:
- Spy bilan kod bajariladi, keyin yozilgan interaction ustida assertion qilinadi.
- Mock bilan kutilgan interaction oldindan belgilanadi va verification shu expectationga asoslanadi.
Bu farq qat’iy sintaksis qoidasi emas. Muhimi test state natijasini yoki hamkorlar protokolini tekshirayotganini tushunishdir.
Async va parallel bajarilish
Async spy coroutine yoki promise semantikasini saqlashi kerak. Oddiy sync funksiya bilan almashtirish kodning await xatti-harakatini noto‘g‘ri qiladi. Callbacklar boshqa taskda keyinroq chaqirilsa, assertiondan oldin ularning tugashi deterministik kutiladi.
Parallel chaqiruvlarda global tartib schedulerga bog‘liq. Test faqat biznes talab qilgan tartibni tekshiradi. Call history thread-safe bo‘lmasa, yozuvlar yo‘qolishi mumkin; har workerga alohida spy yoki concurrency-aware framework ishlatiladi.
Qo‘llanish chegarasi
Logging, metrics, event publication va notification gateway interactionlari spy bilan kuzatiladi. Biroq logning har bir matnini tekshirish testni keraksiz formatga bog‘laydi. Muhim structured field yoki audit hodisasi tekshiriladi.
Spy haqiqiy tashqi xizmatga so‘rov muvaffaqiyatli yetganini isbotlamaydi, faqat client metod chaqirilganini ko‘rsatadi. Contract va integration test protokol, serialization va server javobini qamrab oladi.
Wrapper spy
Wrapper spy haqiqiy dependency’ni ichiga olib, chaqiruvni qayd etgach unga uzatadi. Bu decoratorga o‘xshaydi va framework patchiga kamroq bog‘lanadi. Qaytish qiymati va exception o‘zgartirilmasdan callerga qaytarilishi kerak. Aks holda kuzatuvchi double production xulqini o‘zgartirib yuboradi.
Argument snapshoti
Spy mutable obyektga reference saqlasa, metod chaqirilgandan keyin obyekt o‘zgarganda tarixda ham yangi qiymat ko‘rinishi mumkin. Chaqiruv paytidagi argumentni tekshirish uchun deep copy yoki immutable DTO ishlatiladi. Deep copy katta graph, file handle yoki coroutine uchun mumkin emas; kerakli maydonlar alohida yoziladi.
Xatolarni kuzatish
Real metod exception chiqarsa, spy call historyni exceptiondan oldin yoki keyin yozishi frameworkga bog‘liq. Test bu holatni bilishi kerak. Retry ssenariysida har urinishning xatosi va yakuniy muvaffaqiyat alohida qayd etiladi. Faqat oxirgi natija saqlansa, noto‘g‘ri ortiqcha urinish ko‘rinmay qoladi.
Bog‘liq tushunchalar
Test double, Mock object, Stub, Interaction testing, Call history, Partial mock