【问题标题】:Why is Jasmine not waiting for my promises to complete?为什么茉莉不等我的承诺完成?
【发布时间】:2020-11-03 18:51:24
【问题描述】:

我正在使用 FileSystem API 生成一个目录,其中包含 2 个条目,我需要将其用作要运行的测试的输入。问题是 Jasmine 在运行测试之前没有等待承诺解决,所以它失败了。我使用了异步包装器,但它似乎没有什么不同。

有人知道为什么会失败吗?

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);


}));

});

【问题讨论】:

  • 也许我不明白异步函数的使用呢?我认为它迫使承诺在一种等待承诺完成的沙盒环境中运行
  • 顺便说一句,您应该始终调用reject,而不是调用errorHandler
  • 我相信你从这里开始考虑 async/await:javascript.info/async-await 而我正在使用来自 angular/core/testing 的异步:angular.io/api/core/testing/async
  • 哦。正确的。我错过了额外的括号。
  • “为什么 Jasmine 不等我完成承诺?” - 因为她受够了你和你的承诺,然后和阿拉丁跑了。

标签: angular typescript promise jasmine


【解决方案1】:

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

您可以使用fixture.whenStable 当所有承诺都已解决然后继续测试,但我认为在您的情况下,您应该将期望放在 then 中,因为期望将在 then 内部发生的事情之前运行由于 Promise 的异步特性。

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);
  });
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多