Ошибка async от Karma-Jasmine возвращает ошибку: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL [duplicate]

ConcurrentHashMap или ConcurrentLinkedQueue или ConcurrentSkipListMap может быть другой опцией, потому что они никогда не будут бросать любое ConcurrentModificationException, даже если вы удалите или добавите элемент.

16
задан Cheesebaron 18 March 2013 в 15:14
поделиться

2 ответа

Это не относится к самому Угловому, но к асинхронным тестам Jasmine .

Если вам нужно использовать setTimeout, используйте Angular $timeout . И если вы хотите иметь прекрасный контроль над исполнениями setTimeout / $ timeout, используйте mocked Clock .

4
ответ дан Caio Cunha 18 August 2018 в 22:08
поделиться

Прежде всего, setTimeout особенно сложно тестировать, так как трудно издеваться. К счастью, у AngularJS есть обертка вокруг него ($timeout), играющая ту же роль, но ее можно легко высмеивать:

  ls.DoIt = function() {
    var deferred = $q.defer();

    $timeout(function(){
        deferred.resolve(5);
    },3000);

    return deferred.promise;
  }

Макет, предоставленный для $timeout, позволяет нам легко имитировать прошедшее время (с $timeout.flush()), что означает, что наши тесты могут выполняться быстро, не ожидая завершения события async (обратите внимание, что производственный код по-прежнему использует асинхронный API!).

Измененные тесты выглядят так:

it("should equal 5",  inject(function(myservice, $timeout) {

    var valueToVerify;
    myservice.DoIt().then(function(returned) {
      valueToVerify = returned;  
    });  
    $timeout.flush();        
    expect(valueToVerify).toEqual(5);
}));

И, наконец, рабочий jsFiddle: http://jsfiddle.net/v9L9G/1/

30
ответ дан Mark Amery 18 August 2018 в 22:08
поделиться
  • 1
    Спасибо за подробное объяснение. Служба, которую я пишу, использует IndexedDB, и api является асинхронным, и я боюсь, как я могу применить вышеописанное, когда функция DoIt вызовет что-то вроде request.onsuccess = function (event) {// Сделайте что-то с request.result! deferred.resolve (результат); }; – Hidden Developer 19 March 2013 в 02:35
  • 2
    @Pawel Что делать, если я тестирую контроллер, который использует сервисный модуль f1, и внутри этого контроллера DoIt находится в цикле, поэтому он вызывается несколько раз. Как его красить несколько раз? Невозможно ли вы DoIt сброситься? Я попытался получить асинхронный макет, чтобы очистить себя, включив в него этот , но это не кажется очень надежным. – M.K. Safi 26 September 2013 в 15:28
  • 3
    На самом деле, скрипка, которую я разделял выше, кажется, успешно обманывает себя. Проблема, с которой я столкнулась, оказалась где-то еще ... – M.K. Safi 26 September 2013 в 16:20
  • 4
    @ pkozlowski.opensource Как мы проверяем, что valueToVerify все еще не определено после 1000 мс? – Lukasz Prus 1 October 2014 в 20:01
Другие вопросы по тегам:

Похожие вопросы: