Верните функцию с журналом вызовов, значением по умолчанию и очередью одноразовых результатов. Каждый вызов сохраняет аргументы и забирает ближайшее заданное значение.
Самодельный mock‑функционал с учётом вызовов и аргументов
Верните функцию с журналом вызовов, значением по умолчанию и очередью одноразовых результатов. Каждый вызов сохраняет аргументы и забирает ближайшее заданное значение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте собственную mock‑функцию, которая будет вести учёт количества её вызовов, сохранять переданные в каждый вызов аргументы и предоставлять возможность задавать заранее определённые возвращаемые значения, имитируя тем самым поведение оригинального метода.
Ответ
Верните функцию с журналом вызовов, значением по умолчанию и очередью одноразовых результатов. Каждый вызов сохраняет аргументы и забирает ближайшее заданное значение.
function mockFunction() {
const once = [];
let defaultValue;
function mock(...args) {
mock.data.calls++;
mock.data.args.push(args);
return once.length ? once.shift() : defaultValue;
}
mock.data = { calls: 0, args: [] };
mock.mockReturnValue = value => { defaultValue = value; return mock; };
mock.mockReturnValueOnce = value => { once.push(value); return mock; };
mock.mockClear = () => { mock.data.calls = 0; mock.data.args = []; return mock; };
return mock;
}
const fn = mockFunction().mockReturnValue(0).mockReturnValueOnce(42);
fn('a'); // 42
fn('b'); // 0
Очистка журнала не меняет настроенные результаты. Объекты в аргументах сохраняются по ссылке. Это минимальный синхронный mock; Promise можно задать возвращаемым значением, но полноценный тестовый фреймворк здесь не воспроизводится.