Тестирование setInterval - PullRequest
0 голосов
/ 16 мая 2019

У меня проблемы с тестированием кода, который использует setInterval.

Моя функция в проверке компонентов, если текущее время находится после заданного времени.

Я ожидаю, что isAfter флаг должен быть ложным при запуске и через 6 секунд должен быть истинным (при 2,3,4 секундах должен быть ложным)

Теперь это все еще ложь.

код компонента

  isAfter: boolean;

  private interval;

  ngOnInit(): void {
    const now = new Date();
    const time = now.setSeconds(now.getSeconds() + 5);

    const future = new Date(time);

    this.checkTime(future);
  }

  private checkTime(time: any): void {
    this.interval = setInterval(() => {
      const now = new Date();

      if (now === time) {
        console.log('stop');
        this.isAfter = true;
        clearInterval(this.interval);

      } else {
        console.log('next');
        this.isAfter = false;
      }
    }, 1000);
  }
}

код спецификации

import { TestBed, async, ComponentFixture, fakeAsync, tick, discardPeriodicTasks } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('AppComponent', () => {

  let component: AppComponent;
  let fixture: ComponentFixture<AppComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
    }).compileComponents();


    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
  }));


  it ('should check time', fakeAsync(() => {

    fixture.detectChanges();
    console.log('isAfter 1', component.isAfter);

    tick(3000);
    fixture.detectChanges();
    console.log('isAfter 3', component.isAfter);

    tick(6000);
    fixture.detectChanges();
    console.log('isAfter 6', component.isAfter);

    discardPeriodicTasks();

  }));

});

1 Ответ

1 голос
/ 16 мая 2019
if (now === time)

Эта строка сравнивается по ссылке, и здесь у вас есть два разных объекта даты. Вы должны изменить его на:

if (now.getTime() === time.getTime())

, который вместо этого сравнивает два примитивных числа.

...