Как вы делаете sh requestIdleCallback в сервисном тесте Angular? - PullRequest
1 голос
/ 11 апреля 2020

Я пишу сервис Angular, который использует requestIdleCallback для вызова другой функции, foo. В моем тесте я хочу убедиться, что в конечном итоге вызывается foo.

В настоящее время у меня есть тест, который выглядит следующим образом:

   it('test', fakeAsync(() => {
     // Triggers a requestIdleCallback call.
     service.doSomething();

     flush();
     expect(otherService.foo).toHaveBeenCalled();
   }));

Но когда я запускаю этот тест, Я получаю сообщение о том, что otherService.foo никогда не вызывался. Я пытался заменить грипп sh на flushMicroTasks() и tick() с длинным таймером, но безрезультатно. Единственное, что до сих пор работало, - это использование done() и добавление setTimeout к самому тесту, например, так:

   it('test', (done) => {
     // Triggers a requestIdleCallback call.
     service.doSomething();

     setTimeout(() => {
       expect(otherService.foo).toHaveBeenCalled();      
       done();
     }, 1);
   });

Но я бы хотел избежать этого, потому что это может вызвать некоторую ошибку. Можно ли гарантировать, что requestIdleCallback было сброшено до того, как я сделаю свое тестовое утверждение?

1 Ответ

0 голосов
/ 11 апреля 2020

В соответствии с этим PR-комментарием , вы можете определить собственные макрозадачи, которые будут тестироваться fakeAsync зоной.

Они говорят, что у вас есть два варианта:

  1. передать параметры из FakeAsyncTestSpe c конструктор

    const testZoneSpec = new FakeAsyncTestZoneSpec('name', false, [{source: 'HTMLCanvasElement.toBlob'}]);
    
  2. иногда тестовый код приложения не может получить доступ к FakeAsyncTestSpe c инициализации процесса, поэтому пользователь также может определите глобальную переменную перед загрузкой fakeAsyncTest.

    [...]

    window['__zone_symbol__FakeAsyncTestMacroTask'] = [{
      source: 'HTMLCanvasElement.toBlob',
      callbackArgs: ['testBlobData']  // the test blob data which will be passed back to callback
    }];
    

Так что в вашем случае вы замените source: HTMLCanvasElement.toBlob на source: window.requestIdleCallback.

...