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

Модульное тестирование AngularJS: использование async/await с Jasmine

Я пытаюсь выполнить модульное тестирование своего сервиса Angular, используя ключевое слово async/await в соответствующих модульных тестах (Jasmine) ниже. Тест для нативного Promise работает просто отлично, но я в значительной степени застрял в том, чтобы заставить работать аналог Angular $q.

  • Угловой: 1.6.5
  • Жасмин: 2.7.0
  • (Безголовый) Chrome на MacOS: 60.x

angular
  .module('asyncAwaitTest', [])
  .factory('xService', xServiceFactory);

function xServiceFactory(
  $q,
  $timeout
) {
  return {
    getXAfter1Sec() {
      return new Promise(resolve => setTimeout(() => resolve(43), 1000));
    },
    getXAfter1SecWithAngular$Q() {
      const deferred = $q.defer();

      $timeout(() => deferred.resolve(43), 1000);

      return deferred.promise;
    }
  };
}

jasmine.DEFAULT_TIMEOUT_INTERVAL = 2000;

describe('asyncAwaitTest: x service', () => {
  let $timeout;
  let xService;

  beforeEach(() => {
    module('asyncAwaitTest');

    inject(
      (
        _$timeout_,
        _xService_
      ) => {
        $timeout = _$timeout_;
        xService = _xService_;
      }
    );
  });

  it('should work', async (done) => {
    const x = await xService.getXAfter1Sec();

    expect(x).toEqual(43);

    done();
  });

  it('should work, too. but y not?!!', async (done) => {
    const xPromise = xService.getXAfter1SecWithAngular$Q();

    $timeout.flush();

    const x = await xPromise;

    expect(x).toEqual(43);

    done();
  });
});

Скрипт предоставлен здесь: https://jsfiddle.net/glenn/gaoh6bvc/

Я пробовал Google, но это не дает мне значительного преимущества ????


  • async/await не знаю о $q. Они работают с нативными промисами. Проверьте это: stackoverflow.com /вопросы/35629246/ 30.07.2017
  • Я вижу это. Но есть ли обходной путь? Ставим .run(function runBlock($window, $q) { $window.Promise = $q; }); только хуже - оба теста не пройдены :/ 30.07.2017

Ответы:


1

Вы можете создать помощник для своего теста, который преобразует промис из $q в нативный промис. Проверьте это здесь.

it('should work, too. but y not?!!', async (done) => {
  const xPromise = toNativePromise(xService.getXAfter1SecWithAngular$Q());

  $timeout.flush();

  const x = await xPromise;

  expect(x).toEqual(43);

  done();
});

function toNativePromise(promise) {
  return new Promise((resolve, reject) => {
    promise.then(val => {
      resolve(val);
    }, err => {
      reject(err);
    });
  });
}
30.07.2017
  • Я думаю, что это приемлемый обходной путь на данный момент. Спасибо! :) 31.07.2017

  • 2

    async основаны на нативных промисах, тогда как AngularJS использует промисы $q. await — это синтаксический сахар для связывания обещания с then. Цепочки промисов $q выполняются при дайджесте в тестах.

    Это нельзя исправить с помощью

    await xPromise;
    $rootScope.$digest();
    

    потому что $rootScope.$digest() не оценивается до тех пор, пока не будет выполнено $rootScope.$digest(). Это приводит к ожидающему обещанию.

    AngularJS не следует тестировать с async..await в первую очередь. Angular был разработан для синхронного тестирования.

    It is

    it('...', () => {
      ...
      xPromise.then(x => {
        expect(x).toEqual(43);
      });
      $rootScope.$digest();
    });
    

    Или обещания можно сгладить с помощью jasmine-promise-matchers:

    it('...', () => {
      ...
      expect(xPromise).toBeResolvedWith(43);
      $rootScope.$digest();
    });
    
    30.07.2017
    Новые материалы

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

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

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

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

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

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

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