ТЕСТИРОВАНИЕ И ЗАПОЛНЕНИЕ КОДА С ПОМОЩЬЮ ES6 ПРОКСИ
В моем последнем посте ES6 Proxy я кратко объяснил, что такое прокси ES6 и как их можно использовать в тестовом коде для отслеживания вызовов методов на проксируемом объекте. Однако, что может быть неочевидно, так это то, что прокси можно использовать для создания очень полезной, но легкой библиотеки-заглушки.
КОД
export default function traceMethodCalls({obj, stubMethod = false, throws=false}) { let numberOfTimesCalled = 0; let lastPropertyAccessed = void 0;
const handler = { get(target, key) { if (typeof target[key] !== 'function') { return target[key]; }
return (...args) => { numberOfTimesCalled++; lastPropertyAccessed = key; if (!stubMethod) { return target[key].apply(target, args); } else { return throws ? Promise.reject() : Promise.resolve(); } }; } };
return { proxy: new Proxy(obj, handler), callCount: () => numberOfTimesCalled, lastPropertyAccessed: () => lastPropertyAccessed }; }
ЗАБИВАНИЕ ОБЪЕКТА
Модульное тестирование часто требует передачи в конструктор фиктивных и заглушенных объектов. Например, конструктору объекта может потребоваться объект, представляющий API базы данных и соединение; однако мы не хотели бы передавать реальное соединение с базой данных во время тестирования простого модульного теста. Трассировщик может блокировать вызовы и вместо этого возвращать пустое обещание. Я решил возвращать промисы, потому что часто обнаруживаю, что мои вызовы API асинхронны, и вызов обычно делается только для его побочного эффекта, а не для возвращаемого значения, поэтому это покрывает многие мои потребности в тестировании. Например, распространенный шаблон:
parseData(data)
.then(parsedData => db.save(parsedData))
.then(() => aknowledgeSuccess)
.catch(log.error);
В качестве альтернативы вы можете заставить трассировщик возвращать отклоненное обещание, передав throws: true
— это может быть полезно для тестирования неудачных вызовов API, например. ошибка базы данных или неудачный ответ HTTP.
const tracer = traceMethodCalls({ obj, stubMethod:true });
tracer.proxy.multiply(1, 2)
.then(value => {
assert.equal(value, undefined);
assert.equal(tracer.callCount(), 1);
});
РЕЗЮМЕ
Хотя эта traceMethodCalls
функция, безусловно, не заменит вашу любимую фиктивную, заглушку, шпионскую библиотеку, она настолько проста, что вы можете с радостью скопировать и вставить ее, а затем приступить к ее модификации в соответствии с вашими конкретными потребностями тестирования. Часто использование больших библиотек может разочаровать, если ваши потребности отличаются от общего варианта использования. Пожалуйста, посетите мою страницу github для получения более подробной информации и возможности загрузить код (или даже, надеюсь, внести свой вклад) proxyStub.
Если вы нашли эту статью полезной/вдохновляющей, нажмите💚, чтобы другие тоже могли ею насладиться.
Спасибо за ваше время! Подпишитесь на меня в Twitter и LinkedIn.