Почему Angular стабилен в тестовой среде при выполнении setInterval

#javascript #angular #typescript #unit-testing #jasmine

#javascript #angular #typescript #модульное тестирование #jasmine

Вопрос:

Давайте начнем с этого упрощенного компонента:

 import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  startInterval() {
    setInterval(() => { }, 1000);
  }
}

  

Он содержит startInterval метод, который просто запускает простой интервал. Если приложение запущено, а этот метод не вызывается, Angular считается стабильным. Я подтверждаю это следующим скриптом, выполняемым в консоли браузера:

 window.getAllAngularTestabilities()[0].isStable(); // Returns true
  

Если интервал начался, возвращается тот же скрипт false , чего я и ожидаю — выполняется интервал, поэтому Angular не может быть стабильным.

Однако я не могу воспроизвести это в тестовой среде:

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

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

  it('should make Angular unstable when there are unfinished tasks', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.componentInstance;
    app.startInterval();
    expect(fixture.isStable()).toEqual(false); // Fails, Angular is stable
  });
});

  

Я пробовал тестировать в async и в fakeAsync зонах, но результат все тот же. Я также пытался получить доступ к объекту зоны из устройства, но, похоже, это не дает ожидаемых результатов:

  console.log(fixture.ngZone.hasPendingMicrotasks); // Logs false
 console.log(fixture.ngZone.isStable); // Logs true
  

Почему стабильность Angular отличается в разных средах? Это ошибка, или я что-то упускаю?

Комментарии:

1. Что, если вы используете fixture.detectChanges() after app.startInterval(); в своем тесте?

2. К сожалению, ничего не меняется. Angular по-прежнему стабилен.