ТЕСТИРОВАНИЕ И ЗАПОЛНЕНИЕ КОДА С ПОМОЩЬЮ 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.