Vi
Vitest, vi yardımcı fonksiyonu aracılığıyla size yardımcı olacak işlevler sunar. Bu fonksiyonlara global olarak erişebilirsiniz (global yapılandırma etkinleştirildiğinde), veya vitest'ten içe aktarabilirsiniz:
import { vi } from 'vitest';vi.advanceTimersByTime
Tip:
(ms: number) => VitestrunAllTimersgibi çalışır, ancak belirtilen milisaniye kadar ilerledikten sonra durur. Örneğin, aşağıdaki kod1, 2, 3çıktısını verir ve hata oluşmaz:tslet i = 0; setInterval(() => console.log(++i), 50); vi.advanceTimersByTime(150);
vi.advanceTimersByTimeAsync
Tip:
(ms: number) => Promise<Vitest>runAllTimersAsyncgibi çalışır, ancak belirtilen milisaniye kadar ilerledikten sonra durur. Bu, asenkron olarak ayarlanan zamanlayıcıları da kapsar. Örneğin, aşağıdaki kod1, 2, 3çıktısını verir ve hata oluşmaz:tslet i = 0; setInterval(() => Promise.resolve().then(() => console.log(++i)), 50); await vi.advanceTimersByTimeAsync(150);
vi.advanceTimersToNextTimer
Tip:
() => VitestBir sonraki çalışmaya hazır zamanlayıcıyı tetikler. Her zamanlayıcı tetiklemesi arasında kontroller yapmak için kullanışlıdır. Zamanlayıcıları manuel olarak yönetmek için zincirleme çağrılar yapabilirsiniz.
tslet i = 0; setInterval(() => console.log(++i), 50); vi.advanceTimersToNextTimer() // log 1 .advanceTimersToNextTimer() // log 2 .advanceTimersToNextTimer(); // log 3
vi.advanceTimersToNextTimerAsync
Tip:
() => Promise<Vitest>Asenkron olarak ayarlanmış olsa bile bir sonraki çalışmaya hazır zamanlayıcıyı tetikler. Her zamanlayıcı tetiklemesi arasında kontroller yapmak için kullanışlıdır. Zamanlayıcıları manuel olarak yönetmek için zincirleme çağrılar yapabilirsiniz.
tslet i = 0; setInterval(() => Promise.resolve().then(() => console.log(++i)), 50); vi.advanceTimersToNextTimerAsync() // log 1 .advanceTimersToNextTimerAsync() // log 2 .advanceTimersToNextTimerAsync(); // log 3
vi.getTimerCount
Tip:
() => numberBekleyen zamanlayıcıların sayısını döndürür.
vi.clearAllMocks
Tüm mock fonksiyonlarında .mockClear() fonksiyonunu çağırır. Bu, mock fonksiyonlarının geçmişini temizler, ancak uygulamasını varsayılan haline sıfırlamaz.
vi.clearAllTimers
Çalışması planlanan tüm zamanlayıcıları iptal eder. Bu zamanlayıcılar artık çalıştırılmayacaktır.
vi.dynamicImportSettled
Tüm dinamik içe aktarmaların tamamlanmasını bekler. Aksi takdirde bekleyemeyeceğiniz bir modül içe aktarma işlemi başlatan eşzamanlı bir çağrı varsa kullanışlıdır.
vi.fn
Tip:
(fn?: Function) => MockBir fonksiyon üzerinde izleme (spy) oluşturur, ancak bir fonksiyon olmadan da başlatılabilir. Bir fonksiyon her çağrıldığında, çağrı argümanlarını, dönüş değerlerini ve örneklerini saklar. Ayrıca, metotlarla davranışını değiştirebilirsiniz. Fonksiyon verilmezse, sahte fonksiyon çağrıldığında
undefineddöndürür.tsconst getApples = vi.fn(() => 0); getApples(); expect(getApples).toHaveBeenCalled(); expect(getApples).toHaveReturnedWith(0); getApples.mockReturnValueOnce(5); const res = getApples(); expect(res).toBe(5); expect(getApples).toHaveNthReturnedWith(2, 5);
vi.getMockedSystemTime
Tip:
() => Date | nullsetSystemTimekullanılarak ayarlanan sahte geçerli tarihi döndürür. Tarih sahte değilse,nulldöndürür.
vi.getRealSystemTime
Tip:
() => numbervi.useFakeTimerskullanırken,Date.nowçağrıları sahtedir. Milisaniye cinsinden gerçek zamanı almanız gerekiyorsa, bu fonksiyonu çağırabilirsiniz.
vi.hoisted
Tip:
<T>(factory: () => T) => TSürüm: Vitest 0.31.0'dan beri
ES modüllerindeki tüm statik
importifadeleri dosyanın en üstüne taşınır, bu nedenle içe aktarmalardan önce tanımlanan herhangi bir kod aslında içe aktarmalar değerlendirildikten sonra yürütülür.Ancak, bir modülü içe aktarmadan önce tarihleri sahte hale getirmek gibi bazı yan etkileri tetiklemek yararlı olabilir.
Bu sınırlamayı aşmak için, statik içe aktarmaları aşağıdaki gibi dinamik olanlara dönüştürebilirsiniz:
diffcallFunctionWithSideEffect() - import { value } from './some/module.ts' + const { value } = await import('./some/module.ts')vitestçalıştırırken,vi.hoistedmetodunu kullanarak bunu otomatik olarak yapabilirsiniz.diff- callFunctionWithSideEffect() import { value } from './some/module.ts' + vi.hoisted(() => callFunctionWithSideEffect())Bu metot, fabrikadan döndürülen değeri döndürür. Yerel olarak tanımlanmış değişkenlere kolay erişime ihtiyacınız varsa, bu değeri
vi.mockfabrikalarınızda kullanabilirsiniz:tsimport { expect, vi } from 'vitest'; import { originalMethod } from './path/to/module.js'; const { mockedMethod } = vi.hoisted(() => { return { mockedMethod: vi.fn() }; }); vi.mock('./path/to/module.js', () => { return { originalMethod: mockedMethod }; }); mockedMethod.mockReturnValue(100); expect(originalMethod()).toBe(100);
vi.mock
Tip:
(path: string, factory?: () => unknown) => voidBelirtilen
path'ten içe aktarılan tüm modüllerin yerine başka bir modül koyar. Bir yol içinde yapılandırılmış Vite takma adlarını kullanabilirsiniz.vi.mockçağrısı yukarı taşınır, bu nedenle onu nerede çağırdığınızın bir önemi yoktur. Her zaman tüm içe aktarmalardan önce yürütülecektir. Kapsamı dışındaki bazı değişkenlere erişmeniz gerekiyorsa, bu değişkenlerivi.hoistediçinde tanımlayıpvi.mockiçinde kullanabilirsiniz.WARNING
vi.mockyalnızcaimportanahtar kelimesiyle içe aktarılan modüller için çalışır.requireile çalışmaz.Vitest,
vi.mock'u yukarı taşımak için dosyalarınızı statik olarak analiz eder. Bu, doğrudanvitestpaketinden içe aktarılmayanvi'yi (örneğin, bazı yardımcı dosyalardan) kullanamayacağınız anlamına gelir. Bunu düzeltmek için, her zamanvitest'ten içe aktarılanviilevi.mockkullanın veyaglobalsyapılandırma seçeneğini etkinleştirin.WARNING
Modülleri mocklama şu anda tarayıcı modunda desteklenmemektedir. Bu özelliği GitHub sorununda takip edebilirsiniz.
factorytanımlanmışsa, tüm içe aktarmalar sonucunu döndürür. Vitest, fabrika işlevini yalnızca bir kez çalıştırır vevi.unmockveyavi.doUnmockfonksiyonları çağrılana kadar sonraki tüm içe aktarmalar için sonucu saklar.jest'ten farklı olarak, factory asenkron olabilir, bu nedenle orijinal modülü almak içinvi.importActualveya ilk argüman olarak alınan bir yardımcıyı kullanabilirsiniz.tsvi.mock('./path/to/module.js', async importOriginal => { const mod = await importOriginal(); return { ...mod, // bazı dışa aktarmaları değiştir namedExport: vi.fn(), }; });WARNING
vi.mockyukarı taşınır ve dosyanın en üstünde yer alır. Bu, onu ne zaman yazarsanız yazın (isterbeforeEachiçinde istertestiçinde olsun), aslında bundan önce çağrılacağı anlamına gelir.Bu durum, factory fonksiyonunun dışında tanımlanan değişkenleri factory fonksiyonunun içinde kullanamayacağınız anlamına gelir.
Factory içinde değişkenler kullanmanız gerekiyorsa,
vi.doMock'u deneyin. Aynı şekilde çalışır, ancak yukarı taşınmaz. Yalnızca sonraki içe aktarmaları sahte hale getirdiğine dikkat edin.Ayrıca,
vi.mock'tan önce tanımlanmışsa,vi.hoistedmetodu tarafından tanımlanan değişkenlere de başvurabilirsiniz:tsimport { namedExport } from './path/to/module.js'; const mocks = vi.hoisted(() => { return { namedExport: vi.fn(), }; }); vi.mock('./path/to/module.js', () => { return { namedExport: mocks.namedExport, }; }); vi.mocked(namedExport).mockReturnValue(100); expect(namedExport()).toBe(100); expect(namedExport).toBe(mocks.namedExport);WARNING
Varsayılan dışa aktarmaya sahip bir modülü sahte hale getiriyorsanız, döndürülen factory fonksiyon nesnesi içinde bir
defaultanahtarı sağlamanız gerekir. Bu, bir ES modüllerine özgü bir durumdur, bu nedenlejestbelgeleri farklılık gösterebilir, çünküjestCommonJS modüllerini kullanır. Örneğin,tsvi.mock('./path/to/module.js', () => { return { default: { myDefaultKey: vi.fn() }, namedExport: vi.fn(), // vb... }; });Mockladığınız bir dosyanın yanında bir
__mocks__klasörü varsa ve factory sağlanmamışsa, Vitest__mocks__alt klasöründe aynı ada sahip bir dosya bulmaya çalışacak ve bunu gerçek bir modül olarak kullanacaktır. Bir bağımlılığı sahte hale getiriyorsanız, Vitest projenin kökünde bir__mocks__klasörü bulmaya çalışacaktır (varsayılanprocess.cwd()'dir). deps.moduleDirectories yapılandırma seçeneği aracılığıyla Vitest'e bağımlılıkların nerede bulunduğunu söyleyebilirsiniz.Örneğin, şu dosya yapısına sahipsiniz:
- __mocks__ - axios.js - src __mocks__ - increment.js - increment.js - tests - increment.test.jsBir test dosyasında bir factory sağlanmadan
vi.mockçağırırsanız, bir modül olarak kullanılacak__mocks__klasöründe bir dosya bulacaktır:ts// increment.test.js import { vi } from 'vitest'; // axios, `__mocks__/axios.js`'den varsayılan bir dışa aktarımdır import axios from 'axios'; // increment, `src/__mocks__/increment.js`'den adlandırılmış bir dışa aktarımdır import { increment } from '../increment.js'; vi.mock('axios'); vi.mock('../increment.js'); axios.get(`/apples/${increment(1)}`);WARNING
vi.mock'u çağırmazsanız, modüller otomatik olarak mocklanmaz. Jest'in otomatik mocklama davranışını elde etmek için,setupFilesiçinde gerekli her modül içinvi.mockçağırabilirsiniz.__mocks__klasörü veya sağlanan bir factory yoksa, Vitest orijinal modülü içe aktaracak ve tüm dışa aktarımlarını otomatik olarak sahte hale getirecektir. Uygulanan kurallar için algoritma'ya bakın.
vi.doMock
Tip:
(path: string, factory?: () => unknown) => voidvi.mockile aynıdır, ancak dosyanın en üstüne taşınmadığı için global kapsamdaki değişkenlere erişebilirsiniz. Modülün bir sonraki dinamik içe aktarımı sahte hale getirilecektir. Bu, bundan önce içe aktarılan modülleri sahte hale getirmeyecektir.
// ./increment.js
export function increment(number) {
return number + 1;
}import { beforeEach, test } from 'vitest';
import { increment } from './increment.js';
// modül sahte değil, çünkü vi.doMock henüz çağrılmadı
increment(1) === 2;
let mockedIncrement = 100;
beforeEach(() => {
// bir factory içindeki değişkenlere erişebilirsiniz
vi.doMock('./increment.js', () => ({ increment: () => ++mockedIncrement }));
});
test('bir sonraki modülü içe aktarmak sahte olanı içe aktarır', async () => {
// orijinal içe aktarma SAHTE DEĞİLDİ, çünkü vi.doMock içe aktarmalardan SONRA değerlendirilir
expect(increment(1)).toBe(2);
const { increment: mockedIncrement } = await import('./increment.js');
// yeni dinamik içe aktarma sahte modülü döndürür
expect(mockedIncrement(1)).toBe(101);
expect(mockedIncrement(1)).toBe(102);
expect(mockedIncrement(1)).toBe(103);
});vi.mocked
Tip:
<T>(obj: T, deep?: boolean) => MaybeMockedDeep<T>Tip:
<T>(obj: T, options?: { partial?: boolean; deep?: boolean }) => MaybePartiallyMockedDeep<T>TypeScript için tip yardımcısıdır. Gerçekte sadece geçirilen nesneyi döndürür.
partialtrueolduğunda, birPartial<T>bekleyecektir.tsimport example from './example.js'; vi.mock('./example.js'); test('1+1 eşittir 2', async () => { vi.mocked(example.calc).mockRestore(); const res = example.calc(1, '+', 1); expect(res).toBe(2); });
vi.importActual
Tip:
<T>(path: string) => Promise<T>Mocklanıp mocklanmayacağına dair tüm kontrolleri atlayarak modülü içe aktarır. Modülü kısmen sahte hale getirmek istiyorsanız yararlı olabilir.
tsvi.mock('./example.js', async () => { const axios = await vi.importActual('./example.js'); return { ...axios, get: vi.fn() }; });
vi.importMock
Tip:
<T>(path: string) => Promise<MaybeMockedDeep<T>>Tüm özellikleri (iç içe geçmiş özellikler dahil) mocklanmış bir modülü içe aktarır.
vi.mock'un izlediği aynı kuralları izler. Uygulanan kurallar için algoritma'ya bakın.
vi.resetAllMocks
Tüm mock fonksiyonlarında .mockReset()'i çağırır. Bu, mock fonksiyon geçmişini temizler ve uygulamasını boş bir fonksiyona sıfırlar (undefined döndürür).
vi.resetConfig
Tip:
RuntimeConfigDaha önce
vi.setConfigçağrıldıysa, bu yapılandırmayı orijinal durumuna sıfırlayacaktır.
vi.resetModules
Tip:
() => VitestTüm modüllerin önbelleğini temizleyerek modüller kayıt defterini sıfırlar. Bu, modüllerin yeniden içe aktarıldığında değerlendirilmesini sağlar. En üst düzey içe aktarmalar yeniden değerlendirilemez. Yerel durumun testler arasında çakışma yarattığı modülleri izole etmek için yararlı olabilir.
tsimport { vi } from 'vitest'; import { data } from './data.js'; // Her testten önce yeniden değerlendirilmeyecek beforeEach(() => { vi.resetModules(); }); test('durumu değiştir', async () => { const mod = await import('./some/path.js'); // Yeniden değerlendirilecek mod.changeLocalState('new value'); expect(mod.getLocalState()).toBe('new value'); }); test('modülün eski durumu var', async () => { const mod = await import('./some/path.js'); // Yeniden değerlendirilecek expect(mod.getLocalState()).toBe('old value'); });
WARNING
Mock fonksiyonlar kayıt defterini temizlemez. Mock fonksiyonlar kayıt defterini temizlemek için vi.unmock veya vi.doUnmock kullanın.
vi.restoreAllMocks
Tüm mock fonksiyonlarında .mockRestore()'u çağırır. Bu, mock fonksiyon geçmişini temizler ve uygulamasını orijinal olana sıfırlar.
vi.stubEnv
Tip:
(name: string, value: string) => VitestSürüm: Vitest 0.26.0'dan beri
process.envveimport.meta.env'deki ortam değişkenlerinin değerini değiştirir.vi.unstubAllEnvs'i çağırarak değerini geri yükleyebilirsiniz.
import { vi } from 'vitest';
// `process.env.NODE_ENV` ve `import.meta.env.NODE_ENV`
// "vi.stubEnv" çağrılmadan önce "development"dır
vi.stubEnv('NODE_ENV', 'production');
process.env.NODE_ENV === 'production';
import.meta.env.NODE_ENV === 'production';
// diğer ortamları değiştirmez
import.meta.env.MODE === 'development';TIP
Değeri basitçe atayarak da değiştirebilirsiniz, ancak önceki değeri geri yüklemek için vi.unstubAllEnvs'i kullanamazsınız:
import.meta.env.MODE = 'test';vi.unstubAllEnvs
Tip:
() => VitestSürüm: Vitest 0.26.0'dan beri
vi.stubEnvile değiştirilen tümimport.meta.envveprocess.envdeğerlerini orijinal hallerine geri döndürür. Vitest,stubEnvilk kez çağrıldığında orijinal değeri kaydeder veunstubAllEnvstekrar çağrılana kadar bu değeri saklar.
import { vi } from 'vitest';
// `process.env.NODE_ENV` ve `import.meta.env.NODE_ENV`
// stubEnv çağrılmadan önce "development" değerindedir
vi.stubEnv('NODE_ENV', 'production');
process.env.NODE_ENV === 'production';
import.meta.env.NODE_ENV === 'production';
vi.stubEnv('NODE_ENV', 'staging');
process.env.NODE_ENV === 'staging';
import.meta.env.NODE_ENV === 'staging';
vi.unstubAllEnvs();
// İlk "stubEnv" çağrısından önce kaydedilen değere geri döner
process.env.NODE_ENV === 'development';
import.meta.env.NODE_ENV === 'development';vi.stubGlobal
Tip:
(name: string | number | symbol, value: unknown) => VitestBu fonksiyon, global bir değişkenin değerini geçici olarak değiştirir. Orijinal değerini geri yüklemek için
vi.unstubAllGlobalsfonksiyonunu kullanabilirsiniz.
import { vi } from 'vitest';
// `innerWidth`, stubGlobal çağrılmadan önce "0" değerindedir
vi.stubGlobal('innerWidth', 100);
innerWidth === 100;
globalThis.innerWidth === 100;
// jsdom veya happy-dom kullanıyorsanız
window.innerWidth === 100;TIP
Değeri doğrudan globalThis veya window'a (eğer jsdom veya happy-dom ortamı kullanıyorsanız) atayarak da değiştirebilirsiniz, ancak bu durumda orijinal değeri geri yüklemek için vi.unstubAllGlobals'ı kullanamazsınız:
globalThis.innerWidth = 100;
// jsdom veya happy-dom kullanıyorsanız
window.innerWidth = 100;vi.unstubAllGlobals
Tip:
() => VitestSürüm: Vitest 0.26.0'dan beri
vi.stubGlobalile değiştirilenglobalThis/global(vewindow/top/self/parent, eğerjsdomveyahappy-domortamı kullanıyorsanız) üzerindeki tüm global değerleri orijinal hallerine geri döndürür. Vitest,stubGlobalilk kez çağrıldığında orijinal değeri kaydeder veunstubAllGlobalstekrar çağrılana kadar bu değeri saklar.
import { vi } from 'vitest';
const Mock = vi.fn();
// IntersectionObserver, "stubGlobal" çağrılmadan önce "undefined" değerindedir
vi.stubGlobal('IntersectionObserver', Mock);
IntersectionObserver === Mock;
global.IntersectionObserver === Mock;
globalThis.IntersectionObserver === Mock;
// jsdom veya happy-dom kullanıyorsanız
window.IntersectionObserver === Mock;
vi.unstubAllGlobals();
globalThis.IntersectionObserver === undefined;
'IntersectionObserver' in globalThis === false;
// ReferenceError hatası verir, çünkü tanımlı değil
IntersectionObserver === undefined;vi.runAllTicks
Tip:
() => Vitestprocess.nextTicktarafından sıraya alınan tüm mikro görevleri çalıştırır. Bu, kendi kendileri tarafından planlanan tüm mikro görevleri de çalıştırır.
vi.runAllTimers
Tip:
() => VitestBu metot, zamanlayıcı kuyruğu boşalana kadar başlatılmış olan tüm zamanlayıcıları çalıştırır. Bu,
vi.runAllTimersmetodu çağrıldığında başlatılan tüm zamanlayıcıların çalıştırılacağı anlamına gelir. Sonsuz bir aralığınız varsa, 10.000 tekrardan sonra bir hata fırlatılır. Örneğin, aşağıdaki kod1, 2, 3çıktısını verir:tslet i = 0; setTimeout(() => console.log(++i)); const interval = setInterval(() => { console.log(++i); if (i === 3) clearInterval(interval); }, 50); vi.runAllTimers();
vi.runAllTimersAsync
Tip:
() => Promise<Vitest>Bu metot, zamanlayıcı kuyruğu boşalana kadar başlatılmış olan tüm zamanlayıcıları asenkron olarak çalıştırır. Bu,
vi.runAllTimersAsyncmetodu çağrıldığında başlatılan tüm zamanlayıcıların (asenkron olanlar dahil) çalıştırılacağı anlamına gelir. Sonsuz bir aralığınız varsa, 10.000 tekrardan sonra bir hata fırlatılır. Örneğin, aşağıdaki kodresultçıktısını verir:tssetTimeout(async () => { console.log(await Promise.resolve('result')); }, 100); await vi.runAllTimersAsync();
vi.runOnlyPendingTimers
Tip:
() => VitestBu metot,
vi.useFakeTimers()fonksiyonu çağrıldıktan sonra başlatılan ve henüz çalıştırılmamış olan tüm zamanlayıcıları çalıştırır. Bu metot çalışırken başlatılan zamanlayıcılar tetiklenmeyecektir. Örneğin, aşağıdaki kod yalnızca1çıktısını verir:tslet i = 0; setInterval(() => console.log(++i), 50); vi.runOnlyPendingTimers();
vi.runOnlyPendingTimersAsync
Tip:
() => Promise<Vitest>Bu metot,
vi.useFakeTimers()fonksiyonu çağrıldıktan sonra başlatılan ve henüz çalıştırılmamış olan tüm zamanlayıcıları (asenkron olanlar dahil) asenkron olarak çalıştırır. Bu metot çalışırken başlatılan zamanlayıcılar tetiklenmeyecektir. Örneğin, aşağıdaki kod2, 3, 3, 1çıktısını verir:tssetTimeout(() => { console.log(1); }, 100); setTimeout(() => { Promise.resolve().then(() => { console.log(2); setInterval(() => { console.log(3); }, 40); }); }, 10); await vi.runOnlyPendingTimersAsync();
vi.setSystemTime
Tip:
(date: string | number | Date) => voidSistemin geçerli tarihini, parametre olarak verilen tarihe ayarlar. Bu ayardan sonra tüm
Dateçağrıları bu tarihi döndürecektir.Örneğin, kodunuzda luxon gibi geçerli tarihe bağlı olan herhangi bir şeyi test etmeniz gerekiyorsa kullanışlıdır.
tsconst date = new Date(1998, 11, 19); vi.useFakeTimers(); vi.setSystemTime(date); expect(Date.now()).toBe(date.valueOf()); vi.useRealTimers();
vi.setConfig
Tip:
RuntimeConfigGeçerli test dosyası için yapılandırmayı günceller. Yalnızca testleri yürütürken kullanılan değerleri etkileyebilirsiniz.
vi.spyOn
Tip:
<T, K extends keyof T>(object: T, method: K, accessType?: 'get' | 'set') => MockInstanceBir nesnenin bir metodunda veya getter/setter'ında bir izleyici (spy) oluşturur.
tslet apples = 0; const cart = { getApples: () => 13, }; const spy = vi.spyOn(cart, 'getApples').mockImplementation(() => apples); apples = 1; expect(cart.getApples()).toBe(1); expect(spy).toHaveBeenCalled(); expect(spy).toHaveReturnedWith(1);
vi.stubGlobal
Tip:
(key: keyof globalThis & Window, value: any) => VitestGlobal bir değişkene bir değer atar.
jsdomveyahappy-domkullanıyorsanız, değeriwindownesnesine de atar."Global'leri Mocklama" bölümünde daha fazla bilgi edinin.
vi.unmock
Tip:
(path: string) => voidModülü, taklit edilen modüllerin kayıt defterinden kaldırır. Bu işlemden sonra yapılan tüm import çağrıları, daha önce taklit edilmiş olsa bile orijinal modülü döndürecektir. Bu fonksiyon çağrısı dosyanın en üstüne taşınır (hoisted), bu nedenle yalnızca
setupFilesiçerisinde tanımlanmış olan modüllerin mock'larını kaldırır.
vi.doUnmock
Tip:
(path: string) => voidvi.unmockile aynıdır, ancak dosyanın en üstüne taşınmaz. Bu fonksiyon çağrıldıktan sonra yapılacak bir sonraki import işlemi, mock'lanmış modül yerine orijinal modülü import edecektir. Bu, daha önce içe aktarılmış olan modüllerin taklidini kaldırmaz.
// ./increment.js
export function increment(number) {
return number + 1;
}import { increment } from './increment.js';
// increment zaten mock'lanmış, çünkü vi.mock hoist edilmiştir
increment(1) === 100;
// bu taşınır ve 1. satırdaki içe aktarmadan önce fabrika çağrılır
vi.mock('./increment.js', () => ({ increment: () => 100 }));
// tüm çağrılar taklit edilir ve `increment` her zaman 100 döndürür
increment(1) === 100;
increment(30) === 100;
// bu taşınmaz, bu nedenle diğer içe aktarma taklit edilmemiş modülü döndürecektir
vi.doUnmock('./increment.js');
// bu HALA 100 döndürür, çünkü `vi.doUnmock` bir modülü yeniden değerlendirmez
increment(1) === 100;
increment(30) === 100;
// bir sonraki içe aktarma taklit edilmemiştir, şimdi `increment` sayısı + 1 döndüren orijinal işlevdir
const { increment: unmockedIncrement } = await import('./increment.js');
unmockedIncrement(1) === 2;
unmockedIncrement(30) === 31;vi.useFakeTimers
Tip:
() => VitestZamanlayıcıların mock'lanmasını etkinleştirmek için bu metodu çağırmanız gerekir.
vi.useRealTimers()fonksiyonu çağrılana kadar,setTimeout,setInterval,clearTimeout,clearInterval,nextTick,setImmediate,clearImmediateveDategibi zamanlayıcı fonksiyonlarına yapılan tüm çağrıları mock'layacaktır.Vitest,
--no-threadskullanılaraknode:child_processiçinde çalıştırıldığındanextTick'in taklit edilmesi desteklenmez. NodeJS,node:child_processiçinde dahili olarakprocess.nextTickkullanır ve taklit edildiğinde askıda kalır.nextTick'in taklit edilmesi, Vitest--threadsile çalıştırıldığında desteklenir.Uygulama dahili olarak
@sinonjs/fake-timerskütüphanesini temel alır.TIP
0.35.0sürümünden berivi.useFakeTimers()artıkprocess.nextTick'i otomatik olarak taklit etmiyor.toFakeargümanında seçeneği belirterek hala taklit edilebilir:vi.useFakeTimers({ toFake: ['nextTick'] }).
vi.isFakeTimers
Tip:
() => booleanSürüm: Vitest 0.34.5'ten beri
Sahte zamanlayıcılar etkinse
truedöndürür.
vi.useRealTimers
Tip:
() => VitestZamanlayıcılarla işiniz bittiğinde, taklit edilen zamanlayıcıları orijinal uygulamalarına döndürmek için bu yöntemi çağırabilirsiniz. Daha önce çalıştırılan tüm zamanlayıcılar geri yüklenmeyecektir.
vi.waitFor
- Tip:
<T>(callback: WaitForCallback<T>, options?: number | WaitForOptions) => Promise<T> - Sürüm: Vitest 0.34.5'ten beri
Verilen geri çağırım fonksiyonunun başarılı bir şekilde çalışmasını bekler. Eğer geri çağırım fonksiyonu bir hata fırlatırsa veya reddedilmiş bir Promise dönerse, fonksiyon başarılı olana veya zaman aşımına uğrayana kadar beklemeye devam eder.
Bu, örneğin bir sunucu başlattığınızda ve başlamasını beklemeniz gerektiğinde, bazı asenkron eylemlerin tamamlanmasını beklemeniz gerektiğinde çok kullanışlıdır.
import { expect, test, vi } from 'vitest';
import { createServer } from './server.js';
test('Sunucu başarıyla başlatıldı', async () => {
const server = createServer();
await vi.waitFor(
() => {
if (!server.isReady) throw new Error('Sunucu başlatılmadı');
console.log('Sunucu başlatıldı');
},
{
timeout: 500, // varsayılan 1000'dir
interval: 20, // varsayılan 50'dir
}
);
expect(server.isReady).toBe(true);
});Asenkron geri çağrılar için de çalışır
// @vitest-environment jsdom
import { expect, test, vi } from 'vitest';
import { getDOMElementAsync, populateDOMAsync } from './dom.js';
test('Bir DOM'da öğe var', async () => {
// DOM'u doldurmaya başla
populateDOMAsync();
const element = await vi.waitFor(
async () => {
// var olana kadar öğeyi almaya çalışın
const element = (await getDOMElementAsync()) as HTMLElement | null;
expect(element).toBeTruthy();
expect(element.dataset.initialized).toBeTruthy();
return element;
},
{
timeout: 500, // varsayılan 1000'dir
interval: 20, // varsayılan 50'dir
}
);
expect(element).toBeInstanceOf(HTMLElement);
});vi.useFakeTimers kullanılıyorsa, vi.waitFor her kontrol geri çağrısında otomatik olarak vi.advanceTimersByTime(interval)'ı çağırır.
vi.waitUntil
- Tip:
<T>(callback: WaitUntilCallback<T>, options?: number | WaitUntilOptions) => Promise<T> - Sürüm: Vitest 0.34.5'ten beri
Bu fonksiyon vi.waitFor fonksiyonuna benzerdir, ancak geri çağırım fonksiyonu bir hata fırlatırsa, yürütme hemen durdurulur ve bir hata mesajı alınır. Eğer geri çağırım fonksiyonu falsy bir değer dönerse, bir sonraki kontrol truthy bir değer dönene kadar devam edecektir. Bu, bir sonraki adımı atmadan önce bir şeyin var olmasını beklemeniz gerektiğinde kullanışlıdır.
Aşağıdaki örneğe bakın. Öğenin sayfada görünmesini beklemek için vi.waitUntil'ı kullanabiliriz ve ardından öğeyle bir şeyler yapabiliriz.
import { expect, test, vi } from 'vitest';
test('Öğe doğru şekilde oluşturuluyor', async () => {
const element = await vi.waitUntil(() => document.querySelector('.element'), {
timeout: 500, // varsayılan 1000'dir
interval: 20, // varsayılan 50'dir
});
// öğeyle bir şeyler yapın
expect(element.querySelector('.element-child')).toBeTruthy();
});