Nano Hash - криптовалюты, майнинг, программирование

Как получить покрытие кода внутри обратного вызова с помощью jest?

У меня проблемы с покрытием кода, и я не могу это понять. Я использую API геокодирования Google для запроса координат, когда ответ возвращается внутри функции обратного вызова. Jest используется для тестирования.

Это тестируемый вызов с обратным вызовом:

const geocoder = new google.maps.Geocoder();
geocoder.geocode({address: address}, (results, status) => {
  // want to get coverage in this block
  // expected test results are OK and logging shows right results
});

Это тест. Поскольку при тестировании google.maps по умолчанию недоступен, я нашел такое решение:

it('test', () => {
  const constructorSpy = spyOn(google.maps, 'Geocoder');
  const geocoder = createSpyObj('Geocoder', ['geocode']);
  constructorSpy.and.returnValue(geocoder);
  geocoder.geocode = jest.fn((adr, callback) => callback(response, 'OK'));
  // expected results that are all OK
});

createSpyObj https://stackoverflow.com/a/45319913/1756136:

const createSpyObj = (baseName, methodNames): { [key: string]: Mock<any> } => {
  let obj: any = {};
  for (let i = 0; i < methodNames.length; i++) {
    obj[methodNames[i]] = jest.fn();
  }
  return obj;
};

А google.maps определен в setupTests.js. Если не тестировать, google.maps доступен, когда реагирует на загрузку карты google.

window.google = {
  maps: {
    Geocoder: {},
    GeocoderStatus: {
      OK: 'OK'
    }
  }
};

Есть идеи, что я мог бы попробовать или изучить? Проблема только в покрытии, ожидаемые результаты прекрасны.


Ответы:


1

Покрытие кода на самом деле уже работает правильно с этой реализацией. Проблема заключалась в том, что я не обращался к операторам else в предложениях if, где было только предложение if.

Также можно не шпионить, а определить как свойство и запустить тест:

it('test', () => {
  Object.defineProperty(google, 'maps', {
    value: {
      Geocoder: function () {
        return {
          geocode: jest.fn((adr, callback) => callback(response, 'OK'))
        }
      }
    }
  });
  // expect..
});
13.11.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..