Mundarija (31)
- Bu darsda
- 1. Nega bu kerak?
- 2. Beshta test dublyori
- 3. node:test da spy va stub
- 3.1 Spy: mock.fn
- 3.2 Stub: mock.method
- 3.3 Kanon: idempotentlik testi
- 4. Tikuv: bog'liqlikni parametr qilish
- 4.1 Nega vi.mock kerak bo'lmadi
- 4.2 Sukut qiymat — haqiqiy bog'liqlik
- 5. Ortiqcha mock: test yolg'on gapirganda
- 5.1 Tajriba
- 5.2 Ortiqcha mock belgilari
- 6. Fake: o'z omboringizni yozing
- 6.1 XotiraOmbori — eng muhim fake
- 6.2 Maxsus vaziyatlar uchun meros
- 7. API qadami: test/mock.test.ts (holat 51, 3-qism)
- 8. Ko'p uchraydigan xatolar
- 8.1 Mock o'z javobini tekshiradi
- 8.2 restore unutilgan
- 8.3 Kutubxonani soxtalash
- 8.4 Fake shartnomasiz
- 8.5 Tikuvsiz kodni majburan mock qilish
- 9. Mashqlar
- 1-mashq (oson): turini ayting
- 2-mashq (o'rta): log spy
- 3-mashq (qiyin): fake ombor va shartnoma
- 4-mashq: API qadami
- 10. Real ishda
- Xulosa
- Manbalar
Mock, stub, spy va fake: backend testlarida test dublyorlari
Qisqacha: Test dublyori (test double) — testda haqiqiy bog'liqlik o'rnida turadigan narsa. Turlari: stub tayyor javob qaytaradi, spy chaqiruvlarni yozib boradi, mock kutilgan chaqiruvlarni tekshiradi, fake — ishlaydigan, lekin soddalashtirilgan amalga oshirish (masalan xotiradagi ombor).
node:testda:t.mock.fn(),t.mock.method(obyekt, "nom"). Asosiy qoida: o'z chegarangizni soxtalang (ombor interfeysi,fetchparametri), kutubxona ichini emas. Ortiqcha mock testni yolg'onchi qiladi: bizning misolimizda mock'li test xatoli kodda ham o'tdi, fake'li test esa uni ushladi.
Bu darsda
- Besh xil test dublyorini farqlay olasiz va har biri qachon kerakligini bilasiz.
mock.fnvamock.methodbilan spy va stub yasaysiz, ularni tiklaysiz.- Bog'liqlikni parametr qilib (tikuv) kodni testga qulay qilasiz.
- Ortiqcha mock qanday qilib xatoni yashirishini ko'rsatib bera olasiz.
- Soxta ombor (fake) yozib, uni haqiqiy testlarda ishlatasiz.
Oldin bilishingiz kerak: Vitest II: mock, spy, taymerlar, node:test va node:assert, Backend test strategiyasi, Idempotency-Key.
1. Nega bu kerak?
vazifalar-api ni test qilganda uchta qiyin holat bor:
- Idempotentlik. Bir xil
Idempotency-Keybilan 3 martaPOST. Javob uchala safar 201, lekin ombor bir marta chaqirilganini qanday bilamiz? Javobdan buni ko'rib bo'lmaydi. - Xato holatlari. "Baza uzilsa — 500 va logda sabab". Testda bazani qanday "uzamiz"?
- Tashqi xizmat. Vazifa bajarilganda webhook ketadi. Har test yurganda haqiqiy serverga so'rov yuborib bo'lmaydi.
Uchalasida ham haqiqiy bog'liqlik o'rniga o'rinbosar qo'yamiz. Kinoda xavfli sahnalarni aktyor emas, uning dublyori o'ynaydi — tashqi ko'rinish bir xil, lekin u yiqilishga tayyorlangan. Testdagi dublyor ham shunday: kod uni haqiqiy bog'liqlik deb biladi.
2. Beshta test dublyori
Vitest II darsida vi.fn va vi.spyOn ni ko'rgansiz. Endi turlarni aniq ajratamiz (Gerard Meszaros tasnifi, Martin Fowler maqolasi orqali mashhur):
| Tur | Nima qiladi | vazifalar-api misoli |
|---|---|---|
| Dummy (to'ldiruvchi) | faqat parametr o'rnini to'ldiradi, ishlatilmaydi | log: () => ({ info: () => undefined }) |
| Stub (tayyor javob) | savolga oldindan yozilgan javob | soni() doim 1000 — "ro'yxat to'lgan" |
| Spy (josus) | chaqiruvlarni yozadi, keyin tekshiriladi | soxta fetch — necha marta, qanday tana bilan |
| Mock (soxta) | kutilgan chaqiruvlar oldindan belgilanadi | "yarat aynan 1 marta chaqirilsin" |
| Fake (soddalashtirilgan) | haqiqatan ishlaydi, lekin soddaroq | XotiraOmbori — Postgres o'rnida |
Amalda "mock" so'zi hammasi uchun ishlatiladi (node:test modulining nomi ham mock). Farqni bilish nima uchun kerak? Har tur testga boshqacha ta'sir qiladi: stub va fake — holatni tekshirishga, spy va mock — xulqni (chaqiruvlarni) tekshirishga yordam beradi. Ikkinchisi refaktoringga sezgirroq.
flowchart TD
S{Bog'liqlik nima beradi?} -->|faqat javob| ST[Stub]
S -->|holat saqlaydi| F[Fake]
S -->|chaqiruv o'zi natija| Q{Necha marta, nima bilan?}
Q -->|keyin tekshiraman| SP[Spy]
Q -->|oldindan kutaman| M[Mock]
S -->|hech narsa, faqat kerak| D[Dummy]Diagrammaga qarang: savol "bog'liqlikdan menga nima kerak?" dan boshlanadi. Spy va mock farqi — vaqtda: spy chaqiruvlarni yozib boradi va test oxirida tekshirasiz, mock'da kutilgan chaqiruvlar oldindan aytiladi. Ko'p hollarda javob — fake yoki stub.
3. node:test da spy va stub
3.1 Spy: mock.fn
mock.fn(asl?) — chaqiruvlarini yozib boradigan funksiya qaytaradi. asl berilsa, uni bajaradi va natijani ham yozadi:
import { mock } from "node:test";
const yubor = mock.fn((matn) => `yuborildi: ${matn}`);
yubor("Non olish");
yubor("Sut");
console.log(yubor.mock.callCount());
console.log(yubor.mock.calls.map((c) => c.arguments[0]));
console.log(yubor.mock.calls[1].result);Konsolda:
2
[ 'Non olish', 'Sut' ]
yuborildi: SutHar chaqiruv uchun arguments, result, error, this saqlanadi. Test ichida t.mock.fn() ishlating — test tugaganda avtomatik tozalanadi. Biz bu yerda mock ni testdan tashqarida chaqirdik — shunda u oddiy skriptda ham ishlaydi.
3.2 Stub: mock.method
mock.method(obyekt, "nom", yangi?) — obyektning metodini almashtiradi:
import { mock } from "node:test";
const ombor = {
async soni() { return 3; },
async yarat(matn) { return { id: 4, matn }; },
};
// stub: "ro'yxat to'lgan" holatini yasash
const soni = mock.method(ombor, "soni", async () => 1000);
console.log(await ombor.soni());
soni.mock.mockImplementationOnce(async () => 0);
console.log(await ombor.soni(), await ombor.soni());
soni.mock.restore();
console.log(await ombor.soni());
// yangi funksiyasiz — haqiqiy metod chaqiriladi (spy)
const yarat = mock.method(ombor, "yarat");
console.log(await ombor.yarat("Non"), yarat.mock.callCount());Konsolda:
1000
0 1000
3
{ id: 4, matn: 'Non' } 1Qatorma-qator:
1000— stub ishladi:soni()doim 1000. Xizmat buni ko'rib409beradi — 1000 ta vazifa yaratmasdan.0 1000—mockImplementationOncefaqat keyingi bitta chaqiruvni o'zgartirdi.3—restore()asl metodni qaytardi.- Oxirgi qator:
mock.methodyangi funksiyasiz — aslyaratishladi va chaqiruv sanaldi. Bu stub emas, spy.
3.3 Kanon: idempotentlik testi
Endi «Nega bu kerak?» dagi birinchi savolga javob. Kanon test/mock.test.ts:
test("ombor.yarat bir marta chaqiriladi", async (t) => {
const ombor = new XotiraOmbori();
const yarat = t.mock.method(ombor, "yarat");
const app = ilovaYarat({ ombor });
for (let i = 0; i < 3; i++) {
await request(app)
.post("/v1/vazifalar")
.set("Idempotency-Key", "spy-0001")
.send({ matn: "bir marta" })
.expect(201);
}
assert.equal(yarat.mock.callCount(), 1);
});(request(app) — Supertest, keyingi dars. Test nomi qisqartirildi.) Kanon to'liq test nomida buni "stub (mock.method)" deb atagan. Aslida bu — spy: haqiqiy yarat ishlaydi, faqat chaqiruvlar sanaladi. Nomlarni bunday aralashtirish real loyihalarda juda ko'p uchraydi; muhimi — nimani tekshirayotganingizni bilish.
Bu yerda chaqiruvlar sonini tekshirish to'g'ri, chunki "ombor chaqirilmadi" — idempotentlikning aynan o'zi. Javobdan buni ko'rib bo'lmaydi.
Tekshirib ko'ring: Nega
t.mock.methodniilovaYaratdan oldin chaqiramiz?
Javob
Aslida bu holatda tartib farq qilmaydi: mock.method obyektning xususiyatini almashtiradi, ilova esa har so'rovda ombor.yarat(...) ni xususiyat orqali chaqiradi. Lekin agar kod metodni oldindan olib qo'ysa (const yarat = ombor.yarat ilova yaratilganda), keyingi almashtirish ko'rinmaydi. Xuddi shu sabab bilan nomli import (import { randomUUID }) ni mock.method bilan almashtirib bo'lmaydi — vaqt va tasodif darsida haqiqiy chiqish bilan ko'ramiz. Xavfsiz odat: dublyorni birinchi qo'ying.
4. Tikuv: bog'liqlikni parametr qilish
4.1 Nega vi.mock kerak bo'lmadi
Frontend'da vi.mock("./api") butun modulni almashtirardi. Bu kuchli, lekin "sehrli": import ko'tariladi (hoisting), modul keshi bilan o'ynaladi. node:test da ham mock.module() bor (Node 24 da hali eksperimental, --experimental-test-module-mocks bayrog'i bilan). Kanon uni ishlatmadi — kerak bo'lmadi.
Sabab — tikuv (seam) (Legacy kod va texnik qarz darsidan tanish atama): kod bog'liqligini o'zi yaratmaydi, uni parametr sifatida oladi. Testda boshqa narsa beriladi:
| Kanon kodi | Tikuv | Testda nima beriladi |
|---|---|---|
ilovaYarat({ ombor, log, xabarchi }) |
butun ilova bog'liqliklari | yangi XotiraOmbori, xotiraLogi() |
vazifaXizmati(ombor, log, xabarchi) |
xizmat | soxta ombor, dummy log |
webhookXabarchi(url, { fetchFn }) |
tashqi HTTP | spy fetch |
XotiraOmbori(soat) |
vaqt | qat'iy sana qaytaradigan funksiya |
sorovId(yangiId) |
tasodif | ketma-ket ID |
Bu — bog'liqlik ukoli (dependency injection), framework'siz, oddiy funksiya parametrlari bilan. NestJS (30-qism) aynan shuni avtomatlashtiradi.
4.2 Sukut qiymat — haqiqiy bog'liqlik
Har tikuvda sukut qiymat bor: fetchFn = globalThis.fetch, yangiId = randomUUID, soat = () => new Date(). Ishlab chiqarishda hech narsa berilmaydi — haqiqiysi ishlaydi. Testda bitta parametr bilan almashtiriladi. Kod ikki joyda ham bir xil.
5. Ortiqcha mock: test yolg'on gapirganda
5.1 Tajriba
Xizmat matnni tozalab (trim) omborga berishi kerak, lekin dasturchi buni unutdi. Ikki test yozamiz: biri omborni mock bilan, ikkinchisi fake bilan:
import { mock } from "node:test";
import assert from "node:assert/strict";
// XATO: trim() unutilgan
async function vazifaYarat(ombor, matn) {
return ombor.yarat({ matn }); // to'g'risi: matn.trim()
}
// ❌ Ortiqcha mock: ombor javobini o'zimiz yozdik
const soxta = {
yarat: mock.fn(async () => ({ id: 1, matn: "Non" })),
};
const v1 = await vazifaYarat(soxta, " Non ");
assert.equal(v1.matn, "Non");
console.log("mock bilan: o'tdi");
// ✅ Fake: ishlaydigan, soddalashtirilgan ombor
class XotiraOmbori {
#r = [];
async yarat({ matn }) {
const v = { id: this.#r.length + 1, matn };
this.#r.push(v);
return { ...v };
}
}
try {
const v2 = await vazifaYarat(new XotiraOmbori(), " Non ");
assert.equal(v2.matn, "Non");
console.log("fake bilan: o'tdi");
} catch (x) {
const birinchi = x.message.split("\n")[0];
console.log("fake bilan: yiqildi —", birinchi);
}Konsolda:
mock bilan: o'tdi
fake bilan: yiqildi — Expected values to be strictly equal:Mock'li test xatoli kodda o'tdi. Nega? U o'zi yozgan javobni ("Non") o'zi tekshirdi — aylana mantiq. Kod nima qilmasin, natija bir xil. Bu — yolg'on yashil (false positive) (FT-01 atamasi).
Fake'li test haqiqiy oqimni yurgizdi: xizmat nima bersa, ombor shuni saqladi va qaytardi. Xato ko'rindi.
5.2 Ortiqcha mock belgilari
- Test o'zi qaytartirgan qiymatni o'zi tekshiradi.
- Test "qaysi metod qaysi argument bilan chaqirildi" ni tekshiradi, lekin natijani emas — kod qayta yozilsa (xulq bir xil), test yiqiladi.
- Bitta testda 5–6 ta mock — u kodni emas, mock'larni tekshiryapti.
- Kutubxona soxtalangan:
express.Router, Zod sxemasi,JSON.parse.
Kanon qoidasi (mock.test.ts boshidagi izoh): "o'zimizning chegaramizni soxtalaymiz (fetch tikuvi, ombor interfeysi) — Express yoki Zod ichini emas".
6. Fake: o'z omboringizni yozing
6.1 XotiraOmbori — eng muhim fake
vazifalar-api ning XotiraOmbori si — bir vaqtning o'zida ikkita narsa. Dev'da haqiqiy saqlash (SAQLASH=xotira). Testlarda esa — Postgres o'rnidagi fake. U VazifaOmbori interfeysini to'liq bajaradi va shartnoma testlaridan o'tadi. Shuning uchun unga ishonsa bo'ladi: Postgres'da xulq bir xil bo'lishini shartnoma kafolatlaydi.
"Mock qilma — o'zingnikini yoz" degan maslahat shundan: interfeys orqasidagi bazani mock bilan taqlid qilish o'rniga, uning kichik, ishlaydigan nusxasini yozing va unga shartnoma testlarini qo'llang.
6.2 Maxsus vaziyatlar uchun meros
Kanon xato va sekinlik holatlari uchun XotiraOmbori dan meros oluvchi kichik fake'lar yozgan:
// test/xato.test.ts — har o'qishda "baza uzildi"
class BuzuqOmbor extends XotiraOmbori {
override ol(): Promise<undefined> {
return Promise.reject(new Error("ulanish uzildi: parol=maxfiy"));
}
}
// test/idempotentlik.test.ts — parallel so'rovlar uchun sekin yozuv
class SekinOmbor extends XotiraOmbori {
override async yarat(yangi: YangiVazifa): Promise<Vazifa> {
await new Promise((r) => setTimeout(r, 150));
return super.yarat(yangi);
}
}BuzuqOmbor bilan kanon tekshiradi: 500 javobida "parol=maxfiy" yo'q, logda esa to'liq xato sorovId bilan bor. SekinOmbor bilan: bir xil kalit bilan ikki parallel so'rov — biri 201, ikkinchisi 409 + Retry-After. Ikkala holatni ham stub bilan qilish mumkin edi, lekin meros o'qishga osonroq va qolgan metodlar haqiqiy ishlaydi.
Tekshirib ko'ring:
BuzuqOmbor— stub, spy yoki fake?
Javob
Aralash: asosi fake (XotiraOmbori), bitta metodi esa stub (ol doim xato qaytaradi). Bu odatiy — tasnif tushunish uchun, qat'iy qoida emas. Muhimi, test "o'qishda xato bo'lsa, foydalanuvchi va log nimani ko'radi" degan xulqni tekshiradi, metod chaqiruvlarini emas.
7. API qadami: test/mock.test.ts (holat 51, 3-qism)
Bugun test/mock.test.ts ning birinchi qismi — idempotentlikdagi spy («Kanon: idempotentlik testi» bo'limi). Uning uchun supertest kerak — uni keyingi darsda o'rnatamiz, shuning uchun testni bugun fetch bilan yozing (4-mashq). Webhook testlari — Tashqi HTTP darsida, vaqt va tasodif — BT-08 da. Hali commit qilmang. Dars oxirida npm run check yashil bo'lishi kerak: 58 + 1 = 59 test.
8. Ko'p uchraydigan xatolar
8.1 Mock o'z javobini tekshiradi
«Ortiqcha mock» tajribasi. Natijani haqiqiy (yoki fake) oqimdan oling.
8.2 restore unutilgan
Testdan tashqaridagi mock.method keyingi testlarga ham ta'sir qiladi. Test ichida t.mock — avtomatik tiklanadi; global mock bo'lsa — mock.restoreAll() afterEach da.
8.3 Kutubxonani soxtalash
mock.method(express.response, "json") — Express yangilansa, test noto'g'ri sababdan yiqiladi yoki o'tadi. Kutubxonani haqiqiy ishlating, faqat o'z chegarangizni soxtalang.
8.4 Fake shartnomasiz
Fake ombor haqiqiysidan boshqacha ishlaydi (masalan nusxa qaytarmaydi) — testlar yashil, prod buziladi. Fake va haqiqiysi bir xil shartnoma testidan o'tsin.
8.5 Tikuvsiz kodni majburan mock qilish
Funksiya ichida new PgOmbori() yoki fetch(...) to'g'ridan — testda almashtirib bo'lmaydi va mock.module kabi sehrga murojaat qilinadi. Bog'liqlikni parametr qiling, sukut qiymat bilan.
9. Mashqlar
1-mashq (oson): turini ayting
(a) fetchFn: async () => new Response(null, { status: 204 }); (b) t.mock.fn<typeof fetch>(…) va keyin callCount() tekshirish; (c) XotiraIdempotentlikOmbori(() => soat) — soat testda qo'lda oshiriladi; (d) log: () => ({ info: () => undefined }) — hech narsa tekshirilmaydi; (e) FaylOmbori vaqtinchalik papkada.
Yechim
(a) Stub — tayyor javob. (b) Spy — chaqiruvlar sanaladi. (c) Fake soat (vaqtni boshqaradigan soddalashtirilgan amalga oshirish) — BT-08 mavzusi. (d) Dummy — faqat parametr o'rnini to'ldiradi. (e) Bu dublyor emas — haqiqiy amalga oshirish, faqat vaqtinchalik joyda; shartnoma testi uni haqiqiy holda tekshiradi.
2-mashq (o'rta): log spy
vazifaXizmati ga o'xshash kichik funksiya yozing. ochir(ombor, log, id) ombordan o'chiradi va log().info({ vazifaId: id }, "vazifa o'chirildi") yozadi. Vazifa yo'q bo'lsa Error("topilmadi") tashlaydi va log yozmaydi. mock.fn bilan spy logger yasang va ikkala holatni tekshiring (logga necha marta, qanday argument bilan yozildi). Ombor — Map.
Yechim
import { mock } from "node:test";
import assert from "node:assert/strict";
async function ochir(ombor, log, id) {
if (!ombor.delete(id)) throw new Error("topilmadi");
log().info({ vazifaId: id }, "vazifa o'chirildi");
}
const info = mock.fn();
const log = () => ({ info });
const ombor = new Map([[1, { matn: "Non" }]]);
await ochir(ombor, log, 1);
assert.equal(info.mock.callCount(), 1);
assert.deepEqual(info.mock.calls[0].arguments, [
{ vazifaId: 1 },
"vazifa o'chirildi",
]);
await assert.rejects(ochir(ombor, log, 1), /topilmadi/);
assert.equal(info.mock.callCount(), 1); // yangi qator yo'q
console.log("log spy: 2 holat o'tdi");Konsolda:
log spy: 2 holat o'tdilog — funksiya (kanondagi () => joriyLog(log) kabi), spy esa uning ichidagi info. Bu yerda chaqiruvni tekshirish o'rinli: log yozish — funksiyaning natijalaridan biri. Kanon esa ko'pincha xotiraLogi() bilan haqiqiy Pino qatorlarini tekshiradi — bu yanada ishonchli.
3-mashq (qiyin): fake ombor va shartnoma
Kichik Kesh emas, TaymerOmbori yozing: qoy(kalit, qiymat, muddatMs), ol(kalit) — muddati o'tgan bo'lsa undefined. Vaqt — konstruktorda beriladigan soat() funksiyasi (sukut Date.now). Testda soxta soat bilan: qo'ying (muddat 1000), 999 ms "o'tkazing" — bor, yana 1 ms — yo'q. setTimeout va haqiqiy kutish ishlatmang.
Yechim
import assert from "node:assert/strict";
class TaymerOmbori {
#m = new Map();
#soat;
constructor(soat = Date.now) {
this.#soat = soat;
}
qoy(kalit, qiymat, muddatMs) {
this.#m.set(kalit, { qiymat, tugash: this.#soat() + muddatMs });
}
ol(kalit) {
const y = this.#m.get(kalit);
if (!y) return undefined;
if (this.#soat() >= y.tugash) {
this.#m.delete(kalit);
return undefined;
}
return y.qiymat;
}
}
let hozir = 0;
const o = new TaymerOmbori(() => hozir);
o.qoy("kalit-1", 201, 1000);
hozir += 999;
assert.equal(o.ol("kalit-1"), 201);
hozir += 1;
assert.equal(o.ol("kalit-1"), undefined);
console.log("muddat: 999 ms bor, 1000 ms yo'q");Konsolda:
muddat: 999 ms bor, 1000 ms yo'qBu — kanondagi XotiraIdempotentlikOmbori(soat) ning qisqa nusxasi: 24 soatlik muddatni test bir zumda "o'tkazadi" (soat += 24 * 60 * 60 * 1000 + 1). Chegarani (>=) ataylab tekshirdik — 999 va 1000 — xatolar aynan chegarada yashaydi.
4-mashq: API qadami
test/mock.test.ts yarating va birinchi testni yozing: t.mock.method(ombor, "yarat"), ilovani ishgaTushir bilan port 0 da oching (test/yordamchi.ts naqshi — ombor ni tashqaridan bering), bir xil Idempotency-Key bilan 3 ta fetch POST, callCount() — 1. Keyin Idempotency-Key ni olib tashlab sinang — nechta bo'ldi? Commit qilmang.
Yechim
Kalit bilan — 1 (ikkinchi va uchinchi so'rov saqlangan javobni oladi, Idempotency-Replayed: true). Kalitsiz — 3: har POST yangi vazifa. Ikkinchi sinov birinchisini mustahkamlaydi: spy haqiqatan chaqiruvlarni sanayotganini va "1" tasodif emasligini ko'rsatadi. Har tekshiruvga "teskari holatda test yiqiladimi?" deb qarash — yaxshi odat. Kanon keyingi darsda bu testni supertest bilan qayta yozadi.
10. Real ishda
- NestJS (30-qism) testlarida
Test.createTestingModule(...).overrideProvider(OmborToken).useValue(soxta)— aynan shu tikuv g'oyasi, framework bilan. - Baza testlari: jamoalar ko'pincha "repository fake + shartnoma" yoki "haqiqiy baza konteynerda" (Testcontainers) dan birini tanlaydi; mock qilingan ORM chaqiruvlari — eng mo'rt variant.
- Kod sharhida (code review) "bu test nimani tekshiryapti — kodnimi yoki mock'nimi?" — eng ko'p beriladigan savollardan.
- Intervyu savollari: "Mock va stub farqi?", "Fake nima va qachon afzal?", "Ortiqcha mock nimaga olib keladi?", "Kodni testga qulay qilish uchun nima qilasiz?".
Xulosa
- Test dublyorlari: dummy (to'ldiruvchi), stub (tayyor javob), spy (chaqiruvlarni yozadi), mock (kutilgan chaqiruvlar), fake (ishlaydigan soddalashtirilgan).
node:test:t.mock.fn(),t.mock.method(obyekt, "nom", yangi?),mockImplementationOnce,restore; test ichida — avtomatik tiklanadi.- Tikuv: bog'liqlik parametr bilan, sukut qiymati haqiqiysi —
vi.mockkabi sehr kerak emas. - Ortiqcha mock xatoni yashiradi: bizning tajribada mock'li test xatoli kodda o'tdi, fake'li — ushladi.
- Chaqiruvni tekshirish faqat chaqiruvning o'zi natija bo'lganda (idempotentlik, webhook); qolgan hollarda — holat va javob.
XotiraOmbori— eng muhim fake; maxsus holatlar uchun meros (BuzuqOmbor,SekinOmbor).
Keyingi dars: Supertest bilan HTTP integration test — ilovani portsiz testlash, request(app).post().send().expect() zanjiri, sarlavhalar, cookie agent va Vitest'da backend sozlamasi.
Manbalar
- Martin Fowler: Mocks Aren't Stubs — dublyorlar tasnifi (Meszaros).
- Node.js hujjati: Test runner — Mocking (v24).
- Kanon:
vazifalar-apiholat 51 (test/mock.test.ts,test/xato.test.ts,test/idempotentlik.test.ts),TESTLAR.md.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!