Jest 如何测试异步加载脚本

陶旭生*_*陶旭生 6 jestjs

我有一个异步加载脚本的工具,使用 jest 进行异步测试,但是 jest 超时并且无法响应脚本。如何实现此功能?

我试着按照文档的承诺写了一个测试样本

这是我的脚本加载器代码和 Jest 测试代码

function mapLoader(key, version, url) {
  return new Promise((resolve, reject) => {
    if (AMap) {
      return resolve(AMap);
    }

    if (!url && (!key || !version)) {
      warn('The parameter is incorrect and must contain the url attribute or the key and version attributes.');
    }

    const aMapUrl = url || `${defaultPath}?v=${version}&key=${key}`;

    const jsApi = document.createElement('script');
    jsApi.charset = 'utf-8';
    jsApi.src = aMapUrl;
    jsApi.onerror = reject;
    jsApi.onload = () => {
      if (window.AMap) {
        AMap = window.AMap;
        // ????? setTimeout ???????????????????????????????
        setTimeout(() => {
          resolve(AMap);
        }, 0);
      } else {
        warn('AMap SDK Load Failure.');
      }
    };

    document.head.appendChild(jsApi);
  });
}
Run Code Online (Sandbox Code Playgroud)
test('test mapLoader function', () => {
  return mapLoader('d2d76e2274bf5973ecfb1f68454b6f3b', '1.4.15').then(AMap => {
    expect(AMap).toBe('peanut butter');
  });
});
Run Code Online (Sandbox Code Playgroud)

超时 - 在 jest.setTimeout.Error 指定的 5000 毫秒超时内未调用异步回调:

Jan*_*ler 0

你必须这样测试:

test('test mapLoader function', (done) => {
  return mapLoader('d2d76e2274bf5973ecfb1f68454b6f3b', '1.4.15')
    .then(AMap => {
      expect(AMap).toBe('peanut butter');
      done();
    });
});
Run Code Online (Sandbox Code Playgroud)

或者甚至让 Jest 等待并且不执行其他测试,直到使用关键字完成async

test('test mapLoader function', async (done) => {
  return mapLoader('d2d76e2274bf5973ecfb1f68454b6f3b', '1.4.15')
    .then(AMap => {
      expect(AMap).toBe('peanut butter');
      done();
    });
});
Run Code Online (Sandbox Code Playgroud)

如果您想告诉 Jest,测试应该失败,在这些情况下,您可以致电done(error).