捕获分支缺少覆盖范围

时间:2018-10-30 19:53:55

标签: javascript mocha chai

我开始使用Node.js和Koa创建一个API。我正在使用Mocha / Chai进行测试,但是由于某些原因,我的任何try/catch块都没有测试catch块。例如,这是Coveralls.io的输出:

router.get(BASE_URL, async (ctx) => {
  try {
    const companies = await queries.getAllCompanies();  
    ctx.body = {
      status: 'success',
      data: companies
    };
  } catch (err) {
    ctx.status = 400;     // !
    ctx.body = {          // !
      status: 'error',
      message: err.message || 'Sorry, an error has occurred.'
    };  
  }
}
  

缺少分支[[0,0],[0,1]]。

我已经用代码中引用的// !标记了这两行。这是我的test.js文件中测试GET API的相关部分:

describe('GET /api/v1/companies', () => {
  const companies = realm.objects('Company');
  it('should return an empty list', (done) => {
    chai.request(server)
    .get('/api/v1/companies')
    .end((err, res) => {
      should.not.exist(err);
      res.status.should.equal(200);
      res.type.should.equal('application/json');
      res.body.status.should.eql('success');
      Object.keys(res.body.data).length.should.eql(0);
      done();
    });
  });
  it('count should be 0', (done) => {
    companies.length.should.eql(0);
    done();
  });
  it('should return 3 newly added companies', (done) => {
    realm.write(() => {
      realm.create('Company', { id: '1', companyName: 'test company 1' });
      realm.create('Company', { id: '2', companyName: 'test company 2' });
      realm.create('Company', { id: '3', companyName: 'test company 3' });
    });

    chai.request(server)
    .get('/api/v1/companies')
    .end((err, res) => {
      should.not.exist(err);
      res.status.should.equal(200);
      res.type.should.equal('application/json');
      res.body.status.should.eql('success');
      Object.keys(res.body.data).length.should.eql(3);
      res.body.data[0].should.include.keys('id', 'companyName', 'notes', 'notesSalt');
      done();
    });
  });
  it('count should be 3', (done) => {
    companies.length.should.eql(3);
    done();
  });
});

我需要怎么做才能为catch块增加覆盖率?我在使用多个API时遇到相同的问题,因此我绝对希望更正测试。

1 个答案:

答案 0 :(得分:0)

实际上,“ await”语句是try-catch块中“ promise”的包装。因此,在“ await”部分中发生的任何错误实际上都在包装器try-catch块中发生。因此,您无法捕获此类错误。

但是您会收到这样的错误

await queries.getAllCompanies().catch((err) => { ... })