Autospec — mock yoki test double interfeysini haqiqiy funksiya, class yoki obyekt spetsifikatsiyasidan avtomatik hosil qilib, mavjud bo‘lmagan atribut va noto‘g‘ri chaqiruv signaturelarini test vaqtida aniqlash mexanizmi. Dinamik tillarda oddiy mock istalgan metod nomini qabul qilishi mumkin; autospec production API bilan test double o‘rtasidagi bunday driftni kamaytiradi.
Signature tekshiruvi
Haqiqiy funksiya send(to, subject, body) parametrlariga ega bo‘lsa, autospec mock ham argumentlar soni va nomlarini tekshiradi. send(to) yoki mavjud bo‘lmagan send_email() chaqiruvi xato beradi. API refactorida parametr olib tashlansa, test eski chaqiruvni erta ko‘rsatadi.
Python unittest.mock kontekstida create_autospec yoki patchning autospec=True imkoniyati keng tarqalgan. Boshqa tillarda interface-based mock va compile-time type checking shunga yaqin himoya beradi. Aniq semantika frameworkga bog‘liq.
Class va instance
Classdan autospec yaratilganda constructor signature ham tekshirilishi mumkin. Mock class chaqirilganda qaytgan instance class metodlariga mos spec oladi. Class atributi va faqat __init__ ichida dinamik yaratiladigan instance atributi discoveryda farq qilishi mumkin.
spec_set kabi qat’iy rejim mockda spetsifikatsiyada yo‘q atributni o‘rnatishni ham taqiqlaydi. Oddiy spec ko‘pincha o‘qishni cheklab, ayrim yozishni qabul qilishi mumkin. Framework hujjati bu farqni aniqlaydi.
Descriptor va side effect
Autospec obyekt atributlarini introspection qiladi. Property yoki descriptor access paytida kod bajaradigan bo‘lsa, spec yaratish kutilmagan side effect yoki exception keltirishi mumkin. Introspection uchun xavfsiz design property getterda tarmoq yoki og‘ir hisob qilmaydi.
Dinamik __getattr__, proxy va runtime generated metodlarni statik introspection to‘liq ko‘rmasligi mumkin. Bunday obyekt uchun Protocol/interface yoki qo‘lda kichik spec aniqroq. Autospec mavjud interfeysni tekshiradi, providerning biznes semantikasini emas.
Async funksiyalar
Async metod autospecda awaitable mock bo‘lishi kerak. Test metod chaqirilganini emas, await qilinganini ham tekshirishi mumkin. Sync mock async metod o‘rniga ishlatilsa, test productiondagi coroutine xulqini noto‘g‘ri modellashtiradi.
Async iterator va context manager uchun __aiter__, __aenter__, __aexit__ protokollari specda mavjud bo‘ladi. Framework versiyasi bu magic metodlarni qo‘llashi kerak.
Cheklovlari
Autospec method nomi va signature driftini topadi, lekin qaytish turi, status kodi, vaqt cheklovi va side effectni avtomatik yaratmaydi. Type annotation runtime tekshirilmasligi mumkin. Test noto‘g‘ri return value bersa, code haqiqiy provider bilan baribir buziladi.
Tashqi service clientining lokal SDK interfeysi autospecga mos bo‘lsa ham, server contracti o‘zgargan bo‘lishi mumkin. Contract va integration test kerak. Shuningdek, haddan tashqari ichki classni autospec qilish testni refactorga bog‘laydi; barqaror port yoki protocol asos sifatida tanlanadi.
Patch joyi
Autospec bilan patch qilganda obyekt e’lon qilingan modul emas, test qilinayotgan kod uni qaysi namespace orqali ishlatayotgan bo‘lsa, o‘sha joy patch qilinadi. Aks holda haqiqiy dependency ishlashda davom etadi, mock esa chaqirilmaydi. Import alias va from module import name bu farqni muhim qiladi.
Return value spetsifikatsiyasi
Funksiya annotationidan return mock uchun barcha runtime xulq avtomatik olinmasligi mumkin. Factory mockining return_value instance specga ega ekanini tekshirish kerak. Chained returnlar autospecdan chiqib oddiy erkin mockga aylansa, keyingi mavjud bo‘lmagan metod yana qabul qilinadi.
Protokolga tayangan spec
Katta concrete class o‘rniga consumerga kerakli kichik Protocol spec sifatida olinsa, test ichki provider metodlariga bog‘lanmaydi. Protocol production adapter tomonidan ham type-check qilinadi. Runtime autospec va static typing bir-birini to‘ldiradi, lekin biznes contractni alohida test talab qiladi.
Bog‘liq tushunchalar
Mock object, Interface, Function signature, Test double, Async mock, Contract testing