can someone explain why exactly the vitest below is failing given the implementation provided.
import { createCacheKeyFromArgs, memoize } from './memoize';
const mocks = {
add: vi.fn((x, y) => x + y),
};
const addMemoize = memoize(mocks.add);
afterEach(() => {
mocks.add.mockClear();
});
const asyncAddMemoize = memoize(function asyncAdd(x, y) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mocks.add(x, y));
}, 500);
});
});
describe('memoize', () => {
it('should memoize the result of add fn and only call it once', () => {
expect.assertions(4);
// Arrange
const addSpy = vi.spyOn(mocks, 'add');
// Act
const resultOne = addMemoize(2, 2);
const resultTwo = addMemoize(2, 2);
const resultThree = addMemoize(2, 2);
// Assert
expect(resultOne).toEqual(4);
expect(resultTwo).toEqual(4);
expect(resultThree).toEqual(4);
expect(addSpy).toHaveBeenCalledTimes(1);
});
});
where memoize implementation is
export const createCacheKeyFromArgs = <ARGS extends unknown[]>(args: ARGS[]) =>
args.reduce((cacheKey, arg) => (cacheKey += `_${typeof arg === 'object' ? JSON.stringify(args) : `${arg}`}_`), '');
export const memoize = <ARGS extends unknown[], RET>(fn: (...args: ARGS) => RET) => {
let cache: Record<string, RET> = {};
return (...args: ARGS) => {
const cacheKey = createCacheKeyFromArgs(args);
if (cache[cacheKey]) {
return cache[cacheKey];
}
const asyncFn = fn.call(undefined, ...args);
cache[cacheKey] = asyncFn;
return asyncFn;
};
};
export default memoize;
It complains with error ‘AssertionError: expected “spy” to be called 1 times, but got 0 times’. I must say I just started to work with vitest, migrating from jest so I’m fairly new to it.