Функциональный JavaScriptФункции-декораторыmedium

Декоратор spy

Декоратор принимает произвольную функцию и возвращает новую функцию, которая делает то же самое, что исходная, но при этом выполняет какие-то дополнительные действия.

Декоратор spy позволяет определить:

  • сколько раз вызывалась функция;
  • вызывалась ли функция хотя бы раз с определенным аргументом;
  • возвращала ли функция хотя бы раз определенное значение.

Пример использования

Функция repeat принимает строку и число, а возвращает новую строку. Мы можем вызвать функцию spy от функции repeat и получить новую функцию. Назовем ее spyRepeat.

Функция spyRepeat ведет себя так же, как исходная: принимает те же два аргумента и возвращает строку. Но в джаваскрипте функция является объектом, поэтому у spyRepeat добавляются три метода: callCount, wasCalledWith и returned.

function repeat(str, count) { return str.repeat(count); } const spyRepeat = spy(repeat); console.log(spyRepeat("abc", 2)); // === "abcabc" console.log(spyRepeat("xx", 4)); // === "xxxxxxxx" console.log(spyRepeat.callCount()); // === 2 console.log(spyRepeat.wasCalledWith("abc")); // === true console.log(spyRepeat.wasCalledWith(4)); // === true console.log(spyRepeat.wasCalledWith(5)); // === false console.log(spyRepeat.returned("xxxxxxxx")); // === true console.log(spyRepeat.returned("qwerty")); // === false