Angular тестирование - не удается запустить утверждение внутри подписки - PullRequest
0 голосов
/ 02 апреля 2020

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

Ошибка: Тайм-аут - Asyn c функция не завершилась в течение 5000 мс (установлено jasmine.DEFAULT_TIMEOUT_INTERVAL)

Я пытался увеличить интервал ожидания для Жасмин, но это не сработало. Вот мой код:

user.service.ts:

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  subject: Subject<string> = new Subject<string>();

  constructor() { }

  sendUserNotification(message: string): void {
    this.subject.next(message);
  }

  getUserNotification(): Observable<string> {
      return this.subject.asObservable();
  }

}

user.service.spe c .ts:

import { TestBed } from '@angular/core/testing';
import { UserService } from './user.service';

describe('UserService', () => {
  let service: UserService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(UserService);
  });

  it('should be able to set and get the registered user', (done) => {
    service.sendUserNotification('testNotification');
    service.getUserNotification().subscribe((notification: string): void => {
      expect(notification).toEqual('testNotification1');   //  This is causing the error
      done();
    });
  });
});

Посоветуйте, пожалуйста, что быть неправым. Спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

Ваша проблема в том, что вы делаете вызов в неправильном порядке.

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

В резюме, в вашем файле spe c вам нужно сделать:

import { TestBed } from '@angular/core/testing';
import { UserService } from './user.service';

describe('UserService', () => {
  let service: UserService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(UserService);
  });

  it('should be able to set and get the registered user', (done) => {
    service.getUserNotification().subscribe((notification) => {
      expect(notification).toEqual('testNotification1');
      done();
    });
    service.sendUserNotification('testNotification');
  });
});
...