Ошибка тестирования angular 7 - rxjs asyncObject Ошибка: время ожидания - асинхронный обратный вызов не был вызван в течение 5000 мс - PullRequest
0 голосов
/ 12 июня 2019

Я получил следующую ошибку:

   Error: Timeout - Async callback was not invoked within 5000ms (set by jasmine.DEFAULT_TIMEOUT_INTERVAL)
            at <Jasmine>

Если я не переинициализирую resourceSubject $ in до того, как оба теста не будут работать вместе (я имею в виду, что тест не охватит весь код подписки),когда я пытаюсь создать новый AsyncSubject beforeEach, я получаю вышеуказанную ошибку

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

, это мой тестовый код:

let resourceSubject$: AsyncSubject<Setting>;
beforeEach(async () => {
  resourceLoaderMock.funToMock.and.returnValue({
      observableObj: resourceSubject$.asObservable() ,
      loadData(){}
    });
  ......
.....
beforeEach(() => {
  subject$ = new AsyncSubject<any>();
  resourceSubject$ = new AsyncSubject<Data>(); // this make the issue , if i removed it i could not run both test cases
});


fit('should get data from server', async () => {
  // given

  // when
  service.loadData();
  resourceSubject$.next(deafultValues)
  resourceSubject$.complete(); 

  // then
  const res: Setting = await new Promise((resolve, reject) => {
    service.subscribe$.subscribe(value => {
      resolve(value);
    });
  });

  expect(deafultValues).toEqual(res);
});

моя служебная функция, которую мне нужно проверить:

this.resource.observableObj.subscribe(
  result => {
    // Handle result
    this.subscriber$.next(result);
    this.subscriber$.complete();
  },
  error => {
    this.subscriber$.next(defaultData);
    this.subscriber$.complete();
  }
);

другой пример с той же ошибкой - когда я хочу проверить образец класса, на который подписан, класс не может быть введен

describe('spec', () => {
  let httpClientMock: jasmine.SpyObj<HttpClient>;
  let loggerMock: jasmine.SpyObj<Logger>;
  let resourceClass: ResourceLoader<Setting>;
  let subject$: AsyncSubject<any>;

 beforeEach(async () => {
    httpClientMock = jasmine.createSpyObj('httpClient', ['get']);
    loggerMock = jasmine.createSpyObj('Logger', [
      'debug',
      'error',
      'trace',
      'info',
      'build'
    ]);
    loggerMock.build.and.returnValue(loggerMock);
  });
  beforeEach(() => {
    subject$ = new AsyncSubject<any>();
    classTest = new ClassTets(Class, 'api-url.com', loggerMock, httpClientMock);
  });

 it('should test', async () => {
    // given
    httpClientMock.get.and.returnValue(subject$);
    // when
    classTest.loadData()
    subject$.next({});
    subject$.complete();

    // then
    const result = await new Promise((resolve, reject) => {

    });

  });
});

1 Ответ

0 голосов
/ 12 июня 2019

Вы создаете новую тему во вложенном beforeEach, поэтому значение, переданное как next, никогда не достигает макета. Он содержит ссылку на старый предмет, обернутый как наблюдаемый. Я предполагаю, что вам нужно будет воссоздать макет после создания новой темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...