#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()
afterapp.startInterval();
в своем тесте?2. К сожалению, ничего не меняется. Angular по-прежнему стабилен.