1 回答

TA貢獻1850條經驗 獲得超11個贊
選項 1.您可以使用真實的實現來模擬該fetch函數。jest.mock并且,我們可以在實現中添加一個間諜。你可以為那個間諜做出斷言。
例如
fetch.ts:
export async function fetch(name) {
return 'real implementation';
}
fetch.test.ts:
import { fetch } from './fetch';
const fetchSpy = jest.fn();
jest.mock('./fetch', () => {
const { fetch } = jest.requireActual('./fetch');
const fetchWithSpy = jest.fn().mockImplementation((...args) => {
fetchSpy(...args);
return fetch(...args);
});
return {
fetch: fetchWithSpy,
};
});
describe('65266282', () => {
it('should set createScrollContextImmediately when result is above the maximum return limit', async () => {
const actual = await fetch('teresa teng');
expect(actual).toBe('real implementation');
expect(fetchSpy).toBeCalledWith('teresa teng');
expect(fetchSpy).toHaveBeenCalledTimes(1);
});
});
測試結果:
PASS examples/65266282/fetch.test.ts
65266282
? should set createScrollContextImmediately when result is above the maximum return limit (8 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.216 s
選項 2.您可以使用Proxy為您的fetch函數創建代理。
Proxy 對象使您能夠為另一個對象創建代理,該代理可以攔截并重新定義該對象的基本操作。
fetch-v2.test.ts:
import { fetch } from './fetch';
const fetchSpy = jest.fn();
const fetchProxy = new Proxy(fetch, {
apply: (target, thisArg, argumentsList) => {
fetchSpy.apply(thisArg, argumentsList);
return target.apply(thisArg, argumentsList);
},
});
describe('65266282', () => {
it('should set createScrollContextImmediately when result is above the maximum return limit', async () => {
const actual1 = await fetchProxy('teresa teng');
expect(actual1).toBe('real implementation');
const actual2 = await fetchProxy('best singer');
expect(actual2).toBe('real implementation');
expect(fetchSpy).toBeCalledWith('teresa teng');
expect(fetchSpy).toBeCalledWith('best singer');
expect(fetchSpy).toHaveBeenCalledTimes(2);
});
});
測試結果:
PASS examples/65266282/fetch-v2.test.ts
65266282
? should set createScrollContextImmediately when result is above the maximum return limit (3 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.484 s
這兩種方法本質上是相同的。核心思想是使用代理、攔截器、高階函數
添加回答
舉報