В чем разница между tick () и flush () в угловом тестировании? - PullRequest
4 голосов
/ 07 июня 2019

В угловой документации я вижу эти две функции, tick() и flush().Оба из них, кажется, делают подобные вещи.Из угловой документации он говорит для галочки:

Имитирует асинхронный ход времени для таймеров в зоне fakeAsync.

и для сброса:

Имитирует асинхронное прохождение времени для таймеров в зоне fakeAsync путем опустошения очереди макросов до тех пор, пока она не станет пустой.Возвращаемое значение - это миллисекунды времени, которые прошли бы.

Может кто-нибудь объяснить мне разницу?

РЕДАКТИРОВАТЬ (ответил в комментариях):

Кроме того, в угловой документации tick() используется без параметров, а в комментарии к этой строке даже используется фраза "flush"

it('should display error when TwainService fails', fakeAsync(() => {
  // tell spy to return an error observable
  getQuoteSpy.and.returnValue(
    throwError('TwainService test failure'));

  fixture.detectChanges(); // onInit()
  // sync spy errors immediately after init

  tick(); // flush the component's setTimeout()

  fixture.detectChanges(); // update errorMessage within setTimeout()

  expect(errorMessage()).toMatch(/test failure/, 'should display error');
  expect(quoteEl.textContent).toBe('...', 'should show placeholder');
}));

1 Ответ

3 голосов
/ 07 июня 2019

Они делают разные вещи относительно асинхронных операций, которые были ранее запущенными .Например;вызов setTimeout(...) запускает асинхронную операцию.

  • tick() перемещается время вперед.
  • flush() перемещается время кконец.

Это может быть лучше проиллюстрировано на модульных тестах для этих функций.

Тик

Этот модульный тест показывает тик, используемый для перемещения времени вперед в шагов до тех пор, пока все 10 таймеры не закончатся.Тик вызывается несколько раз.

https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L205


      it('should clear periodic timers', fakeAsync(() => {
           let cycles = 0;
           const id = setInterval(() => { cycles++; }, 10);

           tick(10);
           expect(cycles).toEqual(1);

           discardPeriodicTasks();

           // Tick once to clear out the timer which already started.
           tick(10);
           expect(cycles).toEqual(2);

           tick(10);
           // Nothing should change
           expect(cycles).toEqual(2);
         }));

Flush

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

https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L273

      it('should flush multiple tasks', fakeAsync(() => {
           let ran = false;
           let ran2 = false;
           setTimeout(() => { ran = true; }, 10);
           setTimeout(() => { ran2 = true; }, 30);

           let elapsed = flush();

           expect(ran).toEqual(true);
           expect(ran2).toEqual(true);
           expect(elapsed).toEqual(30);
         }));
...