Мок (mock) — замінює реальну залежність на контрольовану.
function createMock() {
const mock = { calls: [] };
mock.fn = function(...args) { mock.calls.push(args); };
return mock;
}
const mock = createMock();
mock.fn('hello');
mock.fn(42, true);
mock.fn({name: 'test'});
console.log(`Викликано ${mock.calls.length} разів`);
mock.calls.forEach((args, i) => console.log(`Виклик ${i+1}: ${JSON.stringify(args)}`));
function getDiscount(userId, getUser) {
const user = getUser(userId);
return user.isPremium ? 20 : 5;
}
const premiumStub = id => ({ id, isPremium: true });
const regularStub = id => ({ id, isPremium: false });
console.log(getDiscount(1, premiumStub));
console.log(getDiscount(2, regularStub));
// debounce
const debounce = (fn, delay) => {
let timer;
return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); };
};
// once
const once = fn => {
let called = false, result;
return (...args) => { if (!called) { called = true; result = fn(...args); } return result; };
};
// memoize
const memoize = fn => {
const cache = {};
return (...args) => {
const key = JSON.stringify(args);
if (!(key in cache)) cache[key] = fn(...args);
return cache[key];
};
};
const onceHello = once(() => { console.log('executed'); return 42; });
console.log(onceHello());
console.log(onceHello()); // не виконає знову
console.log(onceHello());
let calls = 0;
const memoSqrt = memoize(n => { calls++; return Math.sqrt(n); });
console.log(memoSqrt(16));
console.log(memoSqrt(16));
console.log(memoSqrt(25));
console.log(`fn викликана ${calls} разів (має бути 2)`);