Mock Fonksiyonlar
vi.fn metodu ile yürütülmesini izlemek için bir mock fonksiyonu oluşturabilirsiniz. Önceden oluşturulmuş bir nesnenin metodunu izlemek için vi.spyOn metodunu kullanabilirsiniz:
import { vi } from 'vitest';
const fn = vi.fn();
fn('hello world');
fn.mock.calls[0] === ['hello world'];
const market = {
getApples: () => 100,
};
const getApplesSpy = vi.spyOn(market, 'getApples');
market.getApples();
getApplesSpy.mock.calls.length === 1;Sahte fonksiyonun sonucunu doğrulamak için expect üzerinde spy assertion'ları (örneğin, toHaveBeenCalled) kullanmalısınız. Bu API referansı, mock davranışını değiştirmek için mevcut özellikleri ve metotları açıklar.
getMockName
Tip:
() => string.mockName(name)metodu ile mock'a verilen adı döndürmek için kullanılır.
mockClear
Tip:
() => MockInstanceHer çağrı hakkındaki tüm bilgileri temizler. Çağrıldıktan sonra,
spy.mock.calls,spy.mock.resultsboş diziler döndürecektir. Farklı assertion'lar arasında mock'u temizlemeniz gerektiğinde kullanışlıdır.Her testten önce otomatik olarak çağrılmasını istiyorsanız, yapılandırmada
clearMocksayarını etkinleştirebilirsiniz.
mockName
Tip:
(name: string) => MockInstanceMock fonksiyonun dahili adını ayarlar. Hangi mock fonksiyonunun assertion'ı geçemediğini belirlemek için kullanışlıdır.
mockImplementation
Tip:
(fn: Function) => MockInstanceMock'ın implementasyonu olarak kullanılacak bir fonksiyonu kabul eder.
Örneğin:
tsconst mockFn = vi.fn().mockImplementation(apples => apples + 1); // veya: vi.fn(apples => apples + 1); const NelliesBucket = mockFn(0); const BobsBucket = mockFn(1); NelliesBucket === 1; // true BobsBucket === 2; // true mockFn.mock.calls[0][0] === 0; // true mockFn.mock.calls[1][0] === 1; // true
mockImplementationOnce
Tip:
(fn: Function) => MockInstanceTek bir çağrı için mock fonksiyonun uygulaması olarak kullanılacak bir fonksiyonu kabul eder. Birden çok fonksiyon çağrısının farklı sonuçlar üretmesi için zincirlenebilir.
tsconst myMockFn = vi .fn() .mockImplementationOnce(() => true) .mockImplementationOnce(() => false); myMockFn(); // true myMockFn(); // falseMock'ın implementasyonları tükendiğinde,
vi.fn(() => defaultValue)veya.mockImplementation(() => defaultValue)ile ayarlanan varsayılan uygulamayı çağıracaktır:tsconst myMockFn = vi .fn(() => 'default') .mockImplementationOnce(() => 'first call') .mockImplementationOnce(() => 'second call'); // 'first call', 'second call', 'default', 'default' console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());
withImplementation
Tip:
(fn: Function, callback: () => void) => MockInstanceTip:
(fn: Function, callback: () => Promise<unknown>) => Promise<MockInstance>Callback çalışırken orijinal mock implementasyonunu geçici olarak geçersiz kılar.
jsconst myMockFn = vi.fn(() => 'original'); myMockFn.withImplementation( () => 'temp', () => { myMockFn(); // 'temp' } ); myMockFn(); // 'original'Asenkron callback'lerle kullanılabilir. Daha sonra orijinal uygulamayı kullanmak için metodun beklenmesi gerekir.
tstest('async callback', () => { const myMockFn = vi.fn(() => 'original'); // Callback asenkron olduğu için bu çağrı beklenmelidir await myMockFn.withImplementation( () => 'temp', async () => { myMockFn(); // 'temp' } ); myMockFn(); // 'original' });Ayrıca,
mockImplementationOnceüzerinde daha yüksek önceliğe sahiptir.
mockRejectedValue
Tip:
(value: any) => MockInstanceAsenkron fonksiyon çağrıldığında bir hatayı reject eder.
tsconst asyncMock = vi.fn().mockRejectedValue(new Error('Async error')); await asyncMock(); // "Async error" hatası verir
mockRejectedValueOnce
Tip:
(value: any) => MockInstanceMock fonksiyonun tek bir çağrısı için reddedilecek bir değeri kabul eder. Zincirlenirse, her ardışık çağrı geçirilen değeri reddeder.
tsconst asyncMock = vi .fn() .mockResolvedValueOnce('first call') .mockRejectedValueOnce(new Error('Async error')); await asyncMock(); // first call await asyncMock(); // "Async error" hatası verir
mockReset
Tip:
() => MockInstancemockClear'ın yaptığını yapar ve implementasyonu boş bir fonksiyona çevirir (çağrıldığındaundefineddöndürür). Bu, mock'u tamamen ilk durumuna döndürmek istediğinizde kullanışlıdır.Her testten önce otomatik olarak çağrılmasını istiyorsanız, yapılandırmada
mockResetayarını etkinleştirebilirsiniz.
mockRestore
Tip:
() => MockInstancemockReset'in yaptığını yapar ve implementasyonu orijinal fonksiyona geri yükler.vi.fn()'den mock'u geri yüklemenin, uygulamayıundefineddöndüren boş bir fonksiyona ayarlayacağını unutmayın.vi.fn(impl)'yi geri yüklemek, uygulamayıimpl'ye geri yükleyecektir.Her testten önce otomatik olarak çağrılmasını istiyorsanız, yapılandırmada
restoreMocksayarını etkinleştirebilirsiniz.
mockResolvedValue
Tip:
(value: any) => MockInstanceAsenkron fonksiyon çağrıldığında resolve edilecek bir değeri kabul eder.
tsconst asyncMock = vi.fn().mockResolvedValue(43); await asyncMock(); // 43
mockResolvedValueOnce
Tip:
(value: any) => MockInstanceMock fonksiyonun tek bir çağrısı için resolve edilecek bir değeri kabul eder. Zincirlenirse, her ardışık çağrı geçirilen değeri resolve eder.
tsconst asyncMock = vi .fn() .mockResolvedValue('default') .mockResolvedValueOnce('first call') .mockResolvedValueOnce('second call'); await asyncMock(); // first call await asyncMock(); // second call await asyncMock(); // default await asyncMock(); // default
mockReturnThis
Tip:
() => MockInstanceImplementasyonu
thisbağlamını döndürecek şekilde ayarlar.
mockReturnValue
Tip:
(value: any) => MockInstanceMock her çağrıldığında döndürülecek bir değeri kabul eder.
tsconst mock = vi.fn(); mock.mockReturnValue(42); mock(); // 42 mock.mockReturnValue(43); mock(); // 43
mockReturnValueOnce
Tip:
(value: any) => MockInstanceMock fonksiyonun tek bir çağrısı için döndürülecek bir değeri kabul eder. Zincirlenirse, her ardışık çağrı geçirilen değeri döndürür.
mockReturnValueOncedeğerleri tükendiğinde,mockImplementationveya diğermockReturn*metotları ile tanımlanan fonksiyon çağrılır.tsconst myMockFn = vi .fn() .mockReturnValue('default') .mockReturnValueOnce('first call') .mockReturnValueOnce('second call'); // 'first call', 'second call', 'default', 'default' console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());
mock.calls
Bu, her çağrı için kullanılan argümanları içeren bir dizidir.
const fn = vi.fn();
fn('arg1', 'arg2');
fn('arg3', 'arg4');
fn.mock.calls ===
[
['arg1', 'arg2'], // ilk çağrı
['arg3', 'arg4'], // ikinci çağrı
];mock.lastCall
Bu, son çağrının argümanlarını içerir. Mock çağrılmadıysa, undefined döndürür.
mock.results
Bu, fonksiyondan döndürülen tüm değerleri içeren bir dizidir. Dizinin bir öğesi, type (tip) ve value (değer) özelliklerine sahip bir nesnedir. Mevcut tipler şunlardır:
'return'- fonksiyon hatasız şekilde döndü.'throw'- fonksiyon bir değer fırlattı.
value özelliği, döndürülen değeri veya fırlatılan hatayı içerir. Fonksiyon bir promise döndürdüyse, çözümlendiğinde value özelliği, promise'in resolve ettiği değer olacaktır.
const fn = vi.fn();
const result = fn(); // sonuç döndürüldü
try {
fn(); // Hata fırlattı
} catch {}
fn.mock.results ===
[
// ilk sonuç
{
type: 'return',
value: 'result',
},
// son sonuç
{
type: 'throw',
value: Error,
},
];mock.instances
Bu, mock fonksiyon new anahtar kelimesiyle çağrıldığında oluşturulan tüm örnekleri içeren bir dizidir. Bunun, bir dönüş değeri değil, fonksiyonun this değeri olduğuna dikkat edin.
WARNING
Mock fonksiyon new MyClass() ile örneklendirilirse, mock.instances, tek bir değere sahip bir dizi olacaktır:
const MyClass = vi.fn();
const a = new MyClass();
MyClass.mock.instances[0] === a;Constructor'dan bir değer döndürürseniz, bu instances dizisinde değil, bunun yerine results içinde olacaktır:
const Spy = vi.fn(() => ({ method: vi.fn() }));
const a = new Spy();
Spy.mock.instances[0] !== a;
Spy.mock.results[0] === a;