Я пытался запустить этот тест более суток, и у меня нет вариантов.
Я пытался использовать варианты fakeAsync
и вводить testScheduler
, но функция tick()
, кажется, не имеет никакого эффекта, и, как я опишу, введение testScheduler
работает слишком хорошо.
Функция, которую я протестирую sh, такова:
ngOnInit() {
...
interval(environment.verificationCheckPollingInterval).pipe(takeUntil(this.destroy)).subscribe(_ =>
this.store.dispatch(fromAccount.checkEmailVerificationStatus()));
}
Я понимаю, что опрос для проверки электронной почты не идеальная практика, но это история для другого дня.
Моя функция тестирования жасмина выглядит следующим образом:
describe('After the verification interval has elapsed', () => {
it('should dispatch a check verification email action after the verification interval has elapsed', fakeAsync(() => {
tick(environment. environment.verificationCheckPollingInterval);
fixture.detectChanges();
testScheduler.run(({ expectObservable, flush, cold }) => {
expectObservable(store.scannedActions$.pipe(
ofType(fromAccount.ActionTypes.checkEmailVerificationStatus),
map((_) => true))).toBe('a', { a: true });
});
}));
});
Кажется, что функция tick
вообще ничего не делает.
Другой подход - ввести scheduler
в компонент и изменить подписку на
interval(environment.verificationCheckPollingInterval, this.scheduler).pipe(takeUntil(this.destroy)).subscribe(_ =>
this.store.dispatch(fromAccount.checkEmailVerificationStatus()));
, а затем в моем настройка теста, включающая
{ provide: Scheduler, useValue: testScheduler }
Но это работает слишком хорошо (кроме того факта, что я буду модифицировать производственный код для поддержки тестов, что далеко от идеала). Причина, по которой он работает слишком хорошо, состоит в том, что, если я ставлю точку останова на обработчик подписки, он вызывается повторно без каких-либо задержек, и на каждом шаге значение testScheduler.frame
увеличивается на 1000
кадров (мой интервал опроса составляет 1 секунду ). Это приводит к зависанию моего браузера и вызывает некоторый тревожный нагрев ноутбука.
Я что-то упустил? Есть ли способ проверить interval
без поджога моего ноутбука?
ОБНОВЛЕНИЕ
У меня было одно очень разумное предложение, которое, к сожалению, не удалось.
Учитывая этот код:
describe('After the verification interval has elapsed', () => {
it('should dispatch a check verification email action after the verification interval has elapsed', (done) => {
store.scannedActions$.pipe(
ofType(fromAccount.ActionTypes.checkEmailVerificationStatus),
take(1)).subscribe(x => {
console.log('action dispatched', x);
done();
});
});
});
вызов console.log
вызывается, но тест завершается неудачно с сообщением
Ошибка: Тайм-аут - Asyn c обратный вызов был не вызывается в течение 5000 мс (устанавливается jasmine.DEFAULT_TIMEOUT_INTERVAL)