#javascript #typescript #unit-testing #jestjs #requestanimationframe
Вопрос:
Я хочу написать модульный тест для своего кода с помощью jest, но я не знаю, как с этим справиться.
Это мой код:
type anyFunction = (...args: any[]) => any
let i = 0
const idMap = new Map<number, ReturnType<typeof requestAnimationFrame>>()
/**
* Clean `id`.
*
* @param id `id` in idMap.
*/
function cleanup(id: number) {
idMap.delete(id)
}
/**
* Use RAF to do somthing. When there's no left frames,
* exec callback function.
*
* @param callback Callback when animation is over.
* @param delayFrames Frames before fn executing.
* @returns Return id of this RAF.
*/
export function createRAF(callback: anyFunction, delayFrames = 1): number {
const id = i
/**
* Call raf when there's no left frame.
*
* @param leftFrames Left frames before executing.
*/
function callRaf(leftFrames: number) {
if (leftFrames === 0) {
cleanup(id)
callback()
return
}
// Call raf and bind real raf id with `idMap`.
const realId = requestAnimationFrame(() => callRaf(leftFrames - 1))
idMap.set(id, realId)
}
callRaf(delayFrames)
return id
}
/**
* Cancel raf by id.
*
* @param id Raf id created by `raf`.
*/
export function cancelRAF(id: number): void {
const realId = idMap.get(id)
if (realId) {
cleanup(id)
cancelAnimationFrame(realId)
}
}
Может быть, мне нужно проверить эффекты, которые cacllback создавал в каждом кадре? Но я не знаю, как это сделать.
Я с нетерпением жду и приветствую любые предложения и идеи.
Ответ №1:
Вы можете использовать jest.spyOn(объект, имя метода) для моделирования window.requestAnimationFrame()
метода и его реализации.
index.ts
:
type anyFunction = (...args: any[]) => any;
let i = 0;
const idMap = new Map<number, ReturnType<typeof requestAnimationFrame>>();
function cleanup(id: number) {
idMap.delete(id);
}
export function createRAF(callback: anyFunction, delayFrames = 1): number {
const id = i ;
function callRaf(leftFrames: number) {
if (leftFrames === 0) {
cleanup(id);
callback();
return;
}
// Call raf and bind real raf id with `idMap`.
const realId = requestAnimationFrame(() => callRaf(leftFrames - 1));
idMap.set(id, realId);
}
callRaf(delayFrames);
return id;
}
index.test.ts
:
import { createRAF } from './';
describe('69582282', () => {
test('should pass', () => {
const requestAnimationFrameSpy = jest.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => {
cb(Date.now());
return Math.random();
});
const callback = jest.fn();
createRAF(callback);
expect(callback).toBeCalledTimes(1);
expect(requestAnimationFrameSpy).toBeCalledTimes(1);
requestAnimationFrameSpy.mockRestore();
});
});
результат теста:
PASS examples/69582282/index.test.ts (11.298 s)
69582282
✓ should pass (6 ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.733 s
версия пакета: «шутка»: «^26.6.3»
Комментарии:
1. Спасибо за ответ, я изучу API в вашем коде и попробую его.