Почему Жасмин не ждет исполнения моих обещаний? - PullRequest
0 голосов
/ 14 июля 2020

Я использую API FileSystem для создания каталога с двумя записями внутри, которые мне нужно использовать в качестве входных данных для теста, который я хочу запустить. Проблема в том, что Жасмин не дожидается разрешения обещания перед запуском теста, поэтому он терпит неудачу. Я использовал обертку asyn c, но, похоже, это не имеет значения.

Кто-нибудь знает, почему она не работает?

describe('traverseDirectory() method', () => {

let directoryToTraverse;
let entries;

beforeEach(async(() => {

    console.log('beforeEach test');


    const file1 = createBlob(['<a id="a"><b id="b">Hello A</b></a>'], {type: 'text/html'});
    const file2 = createBlob(['<a id="b"><b id="b">Hello B</b></a>'], {type: 'text/html'});

    function createFile(fs: any, fileName: string, blob: Blob): Promise<any> {

      return new Promise((resolve, reject) => {

        fs.root.getFile(fileName, {create: true}, (fileEntry) => {

          fileEntry.createWriter((fileWriter) => {
            fileWriter.onwriteend = (e) => {
              resolve(fileEntry);
              // @ts-ignore
            };

            fileWriter.write(blob);
          });
        });
      });
    }

    function moveToDirectory(directoryEntry: any, fileEntry: any): void {
      fileEntry.moveTo(directoryEntry);
    }

    function createDirectory(fs: any, name: string): Promise<any> {
      return new Promise((resolve, reject) => {
        fs.root.getDirectory(name, {create: true}, (directoryEntry) => {
          resolve(directoryEntry);
        }, errorHandler);
      });

    }


    function errorHandler(err: any): void {
      console.log('ERROR:', err);
    }


    const promise = new Promise((resolve, reject) => {

      function onInitFs(fs: any): void {
        createDirectory(fs, 'Documents').then((directoryEntry) => {

          const f1 = createFile(fs, 'File1.html', file1);
          const f2 = createFile(fs, 'File2.html', file2);
          Promise.all([f1, f2]).then((createdEntries) => {
            createdEntries.forEach((entry) => {
              moveToDirectory(directoryEntry, entry);

            });
            directoryToTraverse = directoryEntry;
            console.log('Finished setup');
            resolve();
          });
        });

      }

      // @ts-ignore
      window.webkitRequestFileSystem(window.TEMPORARY, 1024 * 1024, onInitFs, errorHandler);

    });

  })
);

it('should run', async(() => {

  console.log('Running the test');
  service.traverseDirectory(directoryToTraverse).then(res => {
    entries = res;
  });

  expect(directoryToTraverse).toEqual(entries);


}));

});

1 Ответ

0 голосов
/ 14 июля 2020

https://www.digitalocean.com/community/tutorials/angular-testing-async-fakeasync

Вы можете использовать fixture.whenStable, когда все обещания будут выполнены, а затем продолжить тесты, но я думаю, что в вашем случае вы должны поместить ожидаемое значение внутри then, потому что ожидание будет выполняться до того, что произойдет внутри then из-за асинхронной природы обещания.

it('should run', async(() => {

  console.log('Running the test');
  service.traverseDirectory(directoryToTraverse).then(res => {
    entries = res;
    console.log(entries); // make sure you see this line
    expect(directoryToTraverse).toEqual(entries);
  });
}));
...