首页 > 解决方案 > 如何测试异步调用以便伊斯坦布尔将覆盖它?

问题描述

我正在测试单元测试我的 API。在我编写完所有测试后,我实现了覆盖工具istanbul。它涵盖了除了分支之外的所有问题。查看报告后,我发现异步调用没有经过测试,但实际上它们至少运行了 5 次。在这种情况下async运行了 15 次。

我的测试的小例子:

describe('GET /tables', () => {
  it('should GET tables', (done) => {
    chai.request(server)
      .get('/api/v1/tables')
      .then((res) => {
        expect(res).to.have.status(200);
        expect(res.body).to.be.a('array');
        done();
      })
      .catch((err) => {
        done(err)
      })
  });
})

该测试的部分覆盖率报告:

export default async (req, res) => {
  let tables = [];
  try {
    tables = await Tables.findAndCountAll({
      where: {
        ...req.filter,
        material: null
      },
      // order: sort ? sort : [],
      limit: req.pagination.limit, 
      offset: req.pagination.offset
    });
  } catch (err) {
    console.log(err);
    return res.status(500).send({ error: 'Internal server error' });
  }

Line1:标记async (r并说分支未覆盖

标签: javascriptunit-testingmocha.jsistanbulnyc

解决方案


修复。据我了解这个问题,当 nyc 获得转译代码的覆盖率时,它无法将其映射回原始源,因此当这种情况发生时,nyc 会降低覆盖率。插件babel-plugin-istanbul解决了这个问题。它支持 ES2015+ 代码,因此它使用 babel 向后兼容。我遵循了这个简单的教程


推荐阅读